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