Подтвердить что ты не робот

Приоритет "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. Тем не менее, я не уверен, как/где указано не выражение.

4b9b3361

Ответ 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, которые определяют синтаксический анализатор. Заявления - это конструкции верхнего уровня, см. Документация компонентов верхнего уровня (с автономными выражениями, называемыми выражения выражения). Выражения всегда являются частью инструкции, придавая операторам приоритет над тем, что содержится в инструкции.