current python syntax operator-precedence

current - Precedencia de "en" en Python



django request path (2)

Esta es una especie de pregunta (muy básica) de abogado de lenguaje. Entiendo lo que hace el código y por qué, así que no le dé explicaciones elementales.

En una expresión, in tiene mayor prioridad que and . Entonces si escribo

if n in "seq1" and "something": ...

se interpreta como

if (n in "seq1") and "something": ...

Sin embargo, la entrada de un bucle for tiene una precedencia menor que and (de hecho, tiene que hacerlo, de lo contrario, lo siguiente sería un error de sintaxis). Por lo tanto, si un principiante de Python escribe

for n in "seq1" and "something": ...

..., es equivalente a esto:

for n in ("seq1" and "something"): ...

(que, con tal que "seq1" sea verdad, se evalúa for n in "something" ).

Entonces, la pregunta: ¿Dónde está especificada / documentada la precedencia de los for-loop in palabra clave? Entiendo que n in ... no es una expresión en este contexto (no tiene un valor), pero es parte de la sintaxis de la declaración de for . Aún así, no estoy seguro de cómo / dónde se especifica la precedencia de no expresión.


En el contexto de un enunciado for , el in es solo parte de la gramática que compone ese enunciado compuesto, por lo que es distinto del operador in . La especificación de gramática de Python define una instrucción for como esta :

for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite]

Lo importante es que esta particular in no se interpretará como parte de target_list , porque una operación de comparación (por ejemplo, x in [x] ) no es un objetivo válido. Con referencia a la especificación de gramática nuevamente, target_list y target se definen de la siguiente manera :

target_list ::= target ("," target)* [","] target ::= identifier | "(" target_list ")" | "[" target_list "]" | attributeref | subscription | slicing | "*" target

Entonces, la gramática asegura que el analizador ve el primero in token después de una target_list como parte de la declaración for ... in ... y no como un operador binario. Esta es la razón por la cual tratar de escribir cosas muy extrañas como for (x in [x]) in range(5): generará un error de sintaxis: la gramática de Python no permite que las comparaciones como (x in [x]) sean objetivos.

Por lo tanto, para una declaración como for n in "seq1" and "something" no es ambigua. La parte target_list es el identificador n la parte expression_list es la iterable a la que se "seq1" and "something" . Como continúa diciendo la documentación vinculada, cada elemento de iterable se asigna a target_list a su vez.


La palabra in en un ciclo for es parte de una declaración . Las declaraciones no tienen precedencia.

in el operador, por otro lado, siempre va a ser parte de una expresión. La precedencia gobierna la prioridad relativa entre operadores en expresiones.

En las declaraciones, busque las partes de expression en su gramática documentada. Para el enunciado for , la gramática es:

for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite]

El operador and en su ejemplo es parte de la parte expression_list , pero la parte "in" no es parte de la expresión .

El ''orden'' se establece en las reglas de gramática de Python, que rigen el analizador. Las declaraciones son las construcciones de nivel superior; consulte la documentación de componentes de nivel superior (las expresiones independientes se denominan declaraciones de expresión ). Las expresiones son siempre parte de una declaración, dando prioridad a las declaraciones sobre cualquier cosa contenida en una declaración.