¿Cuál es el nombre de ** en python?

57

Al programar Python a veces hago un ** para hacer una conversión. Entiendo lo que hace, pero ¿qué estructuras de datos estoy manipulando? A dict y cual es el otro? Un array ? ¿Hay un nombre para el operador ** ?

    
pregunta Niklas Rosencrantz 23.01.2012 - 18:41

3 respuestas

79

No es un operador como tal, por lo que realmente no tiene nombre, pero se define como una" regla sintáctica ". Por eso debería llamarse:

  • "el argumento de la palabra clave que desempaqueta la sintaxis"

Si tiene una lista de argumentos, *args , se llama "desempaquetar argumento" , de la misma manera que **kwargs se llama "desempaquetar argumento de palabra clave" .

Si lo usas en el lado izquierdo de un = , como en a, *middle, end = my_tuple , dirías "desempaquetar tuple" .

En total, hay tres tipos de argumentos (parámetro único):

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

El argumento *args se llama "parámetro posicional variable" y **kwargs es el "parámetro variable de palabra clave". Los argumentos de solo palabras clave no se pueden dar de manera posicional, porque un parámetro posicional variable tomará todos los argumentos que pase.

La mayoría de esto se puede encontrar en los PEP 0362 y 3102 , así como en el Flujo de control en la sección de documentos. Sin embargo, se debe tener en cuenta que el objeto de firma de función PEP es solo un borrador y que la terminología podría ser solo una idea de una persona. Pero son buenos términos de todos modos. :)

Los argumentos * y ** simplemente descomprimen sus respectivas estructuras de datos:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args) → f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: los iterables son objetos que implementan el método __iter__() y las asignaciones son objetos que implementan keys() y __getitem__() . Cualquier objeto que admita este protocolo será comprendido por los constructores tuple() y dict() , por lo que pueden usarse para desempaquetar argumentos.

    
respondido por el Stefano Palazzo 23.01.2012 - 19:46
13

No creo que tenga un nombre. En la sección Docs de Python en "Desempaquetar listas de argumentos", solo se conoce como "el ** -operator. "

No estoy seguro de lo que quieres decir con "la otra" estructura de datos. Cuando hace f(**kwargs) , desempaqueta el diccionario kwargs como una secuencia de pares clave-valor. No veo que haya otra estructura involucrada.

Copiaré el ejemplo en la documentación anterior para mayor claridad.

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

Vea también: ¿Qué significa * args y ** kwargs?

    
respondido por el Kris Harper 23.01.2012 - 19:04
3

Si no está seguro de cómo llamar a un operador en particular o si no tiene nombre, siempre puede recurrir a Waka Waka Bang Splat como referencia para ayudarte a descubrir cómo llamarlo. En este caso, para ** lo llamaría double-splat , aunque hay algunos nombres alternativos para los símbolos .

    
respondido por el aculich 27.01.2012 - 03:11

Lea otras preguntas en las etiquetas