¿Dónde está el desempaquetado de argumentos de python en el orden de las operaciones?

http://docs.python.org/2/reference/expressions.html#operator-precedence

Mi conjetura es que cae en uno de los compartimientos arriba de las búsquedas de dict, ya que

func(*mydict[mykey]) 

hace la búsqueda del diccionario primero. ¿Hay un gráfico mejor que mi enlace inicial que entra en más detalles sobre el orden de operaciones en python?

El desembalaje * no es un operador; Es parte de la syntax de la llamada. Se define en Llamadas , donde se puede ver que:

 ["," "*" expression] 

… puede ser parte de un argument_list en dos lugares diferentes. (La semántica se describe en los párrafos que comienzan con “Si hay más posicional …” y “Si la syntax …”.)

Así que toma cualquier expression . Puedes ver que ningún operador toma una expression completa como su argumento directo. Por lo tanto, si desea considerar libremente un operador, se enlaza más libremente que cualquier otro operador. Pero recuerda que en realidad no es un operador.

También tenga en cuenta que todo esto se cambió en Python 3.x. Pero la idea básica es la misma: tanto el desempaquetado de argumentos como el desempaquetado de asignaciones toman una expression , no solo una primary , y, por lo tanto, se unen de manera más relajada que cualquier operador, y todos toman una primary o algo más específico.


Mientras tanto, puede intentar ejecutar el analizador en su código para ver qué hace:

 >>> import ast >>> tree = ast.parse('func(*mydict[mykey])') >>> ast.dump(tree) "Module(body=[Expr(value=Call(func=Name(id='func', ctx=Load()), args=[], keywords=[], starargs=Subscript(value=Name(id='mydict', ctx=Load()), slice=Index(value=Name(id='mykey', ctx=Load())), ctx=Load()), kwargs=None))])" 

Puedes ver que toda la expresión del Subscript termina como una starargs en la Call .

El módulo ast utiliza la gramática abstracta en lugar del descrito en el manual de referencia. Tiene diferentes nombres para las cosas, y no maneja algunas cosas que se consideran parte de la gramática pero que en realidad se realizan a un nivel más alto que el analizador, etc., pero, por otro lado, es mucho más fácil de entender de repente. Puedes ver que un expr usado para starargs puede ser un Subscript .

Como mencionó BrenBarn en los comentarios, el desempaquetado se define como parte de las llamadas a funciones (Python 2 y 3) y las declaraciones de asignación (Python 3).

Entonces no, nunca tomará parte de la precedencia del operador porque no es un operador.

¿Cómo sé que esto no intentará desempaquetar “mydict” en este ejemplo? ¿O es esto algo que maneja el analizador de lenguaje?

En su ejemplo, func(*mydict[mykey]) , se aplica la especificación para la llamada a la función. Así que tratemos de analizar eso manualmente.

La parte de base coincide con la definición de call , por lo que *mydict[mykey] es la lista de argument_list . Y en la lista de argumentos, se analizará como "*" expression , siendo mydict[mykey] la expresión. Como tal, el analizador nunca aplicará el desempaquetado primero, porque la gramática simplemente no especifica un caso donde después de la "*" expression sigue otra parte entre paréntesis.