Почему это не синтаксическая ошибка в Python?



заметил строку в нашей кодовой базе сегодня, которая, как я думал, наверняка не смогла бы построить с синтаксической ошибкой, но тесты проходили так, по-видимому, это был действительно действительный python (в обоих 2.x и 3).



пробелы иногда не требуются в условном выражении:



>>> 1if True else 0
1


Он не работает, если LHS является переменной:



>>> x = 1
>>> xif True else 0
File "<stdin>", line 1
xif True else 0
^
SyntaxError: invalid syntax


но это, кажется, все еще работает с другими типами литералов:



>>> {'hello'}if False else 'potato'
'potato'


что здесь происходит, это намеренно часть грамматики по какой-то причине? Является ли эта странная причуда известным / документированным поведением?

427   3  

3 ответов:

пробелы между метками

за исключением начала логической строки или строковых литералов, пробелы в символах пробелов, tab и formfeed могут использоваться взаимозаменяемо для разделения маркеров. Пробелы необходимы между двумя токенами только в том случае, если их конкатенация может быть иначе интерпретирована как другой токен (например, ab-один токен, а b-два токена).

так что в данном случае, 1if не является допустимым маркер, так пробелы являются необязательными. Элемент 1 интерпретируется как целочисленный литерал, из которых if не входит. Так что if интерпретируется отдельно и распознается как ключевое слово.

на xif однако идентификатор распознается, поэтому Python не может видеть, что вы хотели сделать x if там.

Python lexer генерирует два токена для ввода 1if: целое число 1 и ключевое слово if, так как ни один токен, начинающийся с цифры, не может содержать строку if. xif, С другой стороны, распознается как допустимый идентификатор; нет никаких оснований полагать, что это идентификатор, за которым следует ключевое слово, и поэтому передается синтаксическому анализатору как один токен.

С моим ограниченным знанием лексической обработки и токенизации я бы сказал, что вы видите, что любая часть, которая может быть лексически проанализирована как "разные" (т. е. числа/словари и т. д...) от if делается так. Большинство языков игнорируют пробелы, и я полагаю, что Python делает то же самое (исключая, конечно, уровни отступов). Как только токены генерируются, сама грамматика не заботится, она, скорее всего, ищет [EXPRESSION] [IF] [EXPRESSION] [ELSE] [EXPRESSION] группировка, которая, опять же с вашими примерами, будет работать штраф.

Comments

    Ничего не найдено.