Почему "1.real" синтаксическая ошибка, но "1.real" действительна в Python?

Итак, я увидел эти два вопросы по twitter. Как 1.real ошибка синтаксиса, но 1 .real не является?

>>> 1.real
  File "<stdin>", line 1
    1.real
         ^
SyntaxError: invalid syntax
>>> 1 .real
1
>>> 1. real
  File "<stdin>", line 1
    1. real
          ^
SyntaxError: invalid syntax
>>> 1 . real
1
>>> 1..real
1.0
>>> 1 ..real
  File "<stdin>", line 1
    1 ..real
       ^
SyntaxError: invalid syntax
>>> 1.. real
1.0
>>> 1 .. real
  File "<stdin>", line 1
    1 .. real
       ^
SyntaxError: invalid syntax

Ответ 1

Я думаю, что . жадно анализируется как часть числа, если это возможно, делая его float 1. вместо того, чтобы быть частью вызова метода.

В десятичной точке пробелы не допускаются, но вы можете иметь пробелы до и после . в вызове метода. Если за номером следует пробел, разбор номера заканчивается, поэтому он однозначен.

Посмотрите на разные случаи и как они разбираются:

>>> 1.real    # parsed as (1.)real  -> missing '.'
>>> 1 .real   # parsed as (1).real  -> okay
>>> 1. real   # parsed as (1.)real  -> missing '.'
>>> 1 . real  # parsed as (1).real  -> okay
>>> 1..real   # parsed as (1.).real -> okay
>>> 1 ..real  # parsed as (1)..real -> one '.' too much
>>> 1.. real  # parsed as (1.).real -> okay
>>> 1 .. real # parsed as (1)..real -> one '.' too much

Ответ 2

С 1.real Python ищет числовой литерал с плавающей запятой, такой как 1.0, и вы не можете иметь r в поплавке. С помощью 1 .real Python взял 1 как целое число и выполняет поиск атрибута на этом.

Важно отметить, что обработка ошибок синтаксиса с плавающей запятой происходит до поиска атрибута ..

Ответ 3

1.real работает, потому что это атрибут .real, вызванный целым числом.

1.real не работает, потому что вам необходимо пространство в конце поплавка. В противном случае это синтаксическая ошибка.