Почему это не синтаксическая ошибка в 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'
что здесь происходит, это намеренно часть грамматики по какой-то причине? Является ли эта странная причуда известным / документированным поведением?
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