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 **
?
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 **
?
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:
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.
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?
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 .
Lea otras preguntas en las etiquetas python operators type-conversion