Почему добавление 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.