복붙노트

[PYTHON] 리터럴의 속성에 액세스하는 것은 모든 유형에서 작동하지만 'int'에서 작동하지 않습니다. 왜?

PYTHON

리터럴의 속성에 액세스하는 것은 모든 유형에서 작동하지만 'int'에서 작동하지 않습니다. 왜?

나는 파이썬에서 모든 것이 객체라는 것을 읽었고, 다른 유형으로 실험하고 __str__을 호출하기 시작했다. 처음에 나는 정말로 흥분했다고 느끼지만 혼란 스러웠다.

>>> "hello world".__str__()
'hello world'
>>> [].__str__()
'[]'
>>> 3.14.__str__()
'3.14'
>>> 3..__str__()
'3.0'
>>> 123.__str__()
  File "<stdin>", line 1
    123.__str__()
              ^
SyntaxError: invalid syntax

해결법

  1. ==============================

    1.당신은 팸알이 필요합니다 :

    당신은 팸알이 필요합니다 :

    (4).__str__()
    

    문제는 렉서가 "4"라고 생각하는 것입니다. 부동 소수점 숫자가 될 것입니다.

    또한,이 작품 :

    x = 4
    x.__str__()
    
  2. ==============================

    2.123은 3.14만큼의 객체이며, "문제"는 언어의 문법 규칙에 있습니다. 파서는 우리가 float을 정의하려고한다고 생각합니다 - 후행 메서드 호출을 사용하는 int가 아닙니다.

    123은 3.14만큼의 객체이며, "문제"는 언어의 문법 규칙에 있습니다. 파서는 우리가 float을 정의하려고한다고 생각합니다 - 후행 메서드 호출을 사용하는 int가 아닙니다.

    숫자를 괄호로 묶으면 예상되는 동작을 얻을 수 있습니다.

    >>> (123).__str__()
    '123'

    또는 123 뒤에 공백을 추가하면됩니다.

    >>> 123 .__str__()
    '123'

    123 .__ str __ ()에서 작동하지 않는 이유는 123 다음의 점이 부분적으로 선언 된 부동 소수점의 소수점으로 해석된다는 것입니다.

    >>> 123.__str__()
      File "", line 1
        123.__str__()
                  ^
    SyntaxError: invalid syntax

    구문 분석기는 __str __ ()을 숫자 시퀀스로 해석하려고 시도하지만 분명히 실패합니다. 기본적으로 구문 분석기가 예상치 못한 것을 우연히 발견했다고 말하는 SyntaxError가 발생합니다.

    123 .__ str __ ()을 볼 때 파이썬 파서는 3 개의 문자를 사용하고이 3 개의 문자를 정수로 해석하거나 4 개의 문자를 사용하여 이것을 부동 소수점의 시작으로 해석 할 수 있습니다.

    123.__str__()
    ^^^ - int
    
    123.__str__()
    ^^^^- start of floating-point
    

    어린 아이가 가능한 한 많은 케이크를 먹기를 원하는 것처럼, 파서는 욕심이 많으며 한 번에 최대한 많이 마셔야합니다. 비록 이것이 항상 최고의 아이디어는 아니지만, 후자와 같이 ( "더 나은") 대안이 선택됩니다.

    나중에 __str __ ()이 부동 소수점의 소수로 해석 될 수 없다는 것을 알게되면 이미 너무 늦었습니다. SyntaxError.

    이 섹션에는 관련 리터럴의 어휘 정의가 들어 있습니다.

    어휘 분석 - 2.4.5 부동 소수점 리터럴

    floatnumber   ::=  pointfloat | exponentfloat
    pointfloat    ::=  [intpart] fraction | intpart "."
    exponentfloat ::=  (intpart | pointfloat) exponent
    intpart       ::=  digit+
    fraction      ::=  "." digit+
    exponent      ::=  ("e" | "E") ["+" | "-"] digit+
    

    어휘 분석 - 2.4.4 정수 리터럴

    integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
    decimalinteger ::=  nonzerodigit digit* | "0"+
    nonzerodigit   ::=  "1"..."9"
    digit          ::=  "0"..."9"
    octinteger     ::=  "0" ("o" | "O") octdigit+
    hexinteger     ::=  "0" ("x" | "X") hexdigit+
    bininteger     ::=  "0" ("b" | "B") bindigit+
    octdigit       ::=  "0"..."7"
    hexdigit       ::=  digit | "a"..."f" | "A"..."F"
    bindigit       ::=  "0" | "1"
    
  3. ==============================

    3.4시 이후에 공백 추가 :

    4시 이후에 공백 추가 :

    4 .__str__()
    

    그렇지 않으면 렉서는이 표현식을 토큰 "4", "__str__", "("및 ")"로 나눕니다. 즉, 첫 번째 토큰은 부동 소수점 숫자로 해석됩니다. 렉서는 항상 가능한 가장 긴 토큰을 만들려고합니다.

  4. ==============================

    4.실제로 (읽을 수없는 정도를 높이려면 ...) :

    실제로 (읽을 수없는 정도를 높이려면 ...) :

    4..hex()
    

    유효합니다. 그것은 '0x1.0000000000000p + 2'를 제공합니다 - 그렇지만 그것은 물론 float입니다 ...

  5. from https://stackoverflow.com/questions/10955703/accessing-a-python-int-literals-methods by cc-by-sa and MIT license