Почему "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 не работает, потому что вам необходимо пространство в конце поплавка. В противном случае это синтаксическая ошибка.