Приоритет "in" в Python
Это немного (очень простой) язык-юрист. Я понимаю, что делает код, и почему, поэтому, пожалуйста, никаких элементарных объяснений.
В выражении in
имеет более высокий приоритет, чем and
. Поэтому, если я пишу
if n in "seq1" and "something":
...
он интерпретируется так же, как
if (n in "seq1") and "something":
...
Однако, in
цикла for
имеет более низкий приоритет, чем and
(на самом деле он должен, в противном случае следующее будет синтаксической ошибкой). Следовательно, если начинающий Python пишет
for n in "seq1" and "something":
...
..., это эквивалентно этому:
for n in ("seq1" and "something"):
...
(который, если "seq1" является правдивым, оценивается как for n in "something"
).
Итак, вопрос: где приоритет ключевого слова in
for-loop указано/документально? Я понимаю, что n in ...
не является выражением в этом контексте (оно не имеет значения), но является частью синтаксиса оператора for
. Тем не менее, я не уверен, как/где указано не выражение.
Ответы
Ответ 1
В контексте оператора for
in
является лишь частью грамматики, составляющей этот составной оператор, и поэтому он отличается от оператора in
. Спецификация грамматики Python определяет оператор for
как это:
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
Необходимо указать, что этот конкретный in
не будет интерпретироваться как часть target_list, потому что операция сравнения (например, x in [x]
) не является допустимой мишенью. Снова ссылаясь на спецификацию грамматики, target_list и target определяются следующим образом:
target_list ::= target ("," target)* [","]
target ::= identifier
| "(" target_list ")"
| "[" target_list "]"
| attributeref
| subscription
| slicing
| "*" target
Таким образом, грамматика гарантирует, что синтаксический анализатор видит первый маркер in
после целевого_листа как часть инструкции for ... in ...
, а не как двоичный оператор. Вот почему нужно писать очень странно, как for (x in [x]) in range(5):
приведет к синтаксической ошибке: грамматика Python не позволяет сопоставлять такие сравнения, как (x in [x])
.
Поэтому для утверждения, такого как for n in "seq1" and "something"
, недвусмысленно. Часть target_list - это идентификатор n
, а часть expression_list - итерабельность, которую оценивает "seq1" and "something"
. Как уже упоминалось в связанной документации, каждый элемент из итерабельного по очереди назначается целевому списку.
Ответ 2
Слово in
в цикле for
является частью инструкции. Выражения не имеют приоритета.
in
оператор, с другой стороны, всегда будет частью выражения. Приоритет определяет относительный приоритет между операторами в выражениях.
В инструкциях затем найдите части expression
в своей задокументированной грамматике. Для for
statement грамматика:
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
Оператор and
в вашем примере является частью части expression_list
, но часть "in"
не является частью выражения.
Затем "порядок" задается в правилах грамматики Python, которые определяют синтаксический анализатор. Заявления - это конструкции верхнего уровня, см. Документация компонентов верхнего уровня (с автономными выражениями, называемыми выражения выражения). Выражения всегда являются частью инструкции, придавая операторам приоритет над тем, что содержится в инструкции.