Почему добавление 1.__ __ (1) дает синтаксическую ошибку?
Почему
1.__add__(1)
выход SyntaxError: invalid syntax
? Что добавить дополнительные скобки?
(1).__add__(1)
Ответы
Ответ 1
Это эффект токенизатора: 1.__add__(1)
разделяется на токены "1."
, "__add__"
, "("
, "1"
и ")"
, так как токенизатор всегда пытается построить максимально возможное маркер. Первый токен - это номер с плавающей запятой, за которым сразу следует идентификатор, который не имеет смысла для синтаксического анализатора, поэтому он выдает SyntaxError
.
Просто добавив пространство до того, как точка сделает это:
>>> 1 .__add__(1)
2
Ответ 2
Потому что 1.
- допустимый литерал с плавающей точкой, а лексер выполняет правило "максимум munch" - используется самое длинное совпадение. После того, как 1.
расходуется как плавающий литерал, следуют идентификатор __add__
и parens. Весь синтаксический анализатор видит <float> <indentifier>
, который является недопустимым (сравните 1.0 __add__()
, что приводит к тем же токенам, и я надеюсь, что вы видите, как это синтаксическая ошибка) и бессмысленны. Во втором примере есть выражение 1
, завернутое в parens, затем точка (один токен, выбранный парсером как оператор доступа к атрибутам) и т.д., Который, очевидно, действителен.
Ответ 3
Парсер ожидает найти поплавок, но _
не является допустимой цифрой. Параны говорят парсеру прекратить синтаксический анализ после 1
.