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?
python
operators
type-conversion
Niklas Rosencrantz
fuente
fuente
**
. Poder y "diccionario de argumentos de palabras clave". De que estas hablando La documentación tiene estas palabras: "Si está presente el formulario" ** identificador ", se inicializa en un nuevo diccionario que recibe cualquier argumento de palabras clave en exceso, por defecto en un nuevo diccionario vacío". ¿Cuál de ellos parece relevante para tu pregunta?Respuestas:
No es un operador como tal, por lo que realmente no tiene un nombre, pero se define como una "regla sintáctica" . Entonces debería llamarse:
Si tiene una lista de argumentos,
*args
se llama "desempaquetado de argumentos" , de la misma manera**kwargs
se llama "desempaquetado de argumentos de palabras clave" .Si lo usa en el lado izquierdo de un
=
, como ena, *middle, end = my_tuple
, diría "desempaquetado de tuplas" .En total, hay tres tipos de argumentos (parámetro único):
El
*args
argumento se denomina "parámetro de posición variable" y**kwargs
es el "parámetro de palabra clave variable". Los argumentos de solo palabras clave no se pueden dar posicionalmente, porque un parámetro posicional variable tomará todos los argumentos que pase.La mayor parte de esto se puede encontrar en las PEP 0362 y 3102 , así como en la sección Flujo de control de los documentos. Sin embargo, debe tenerse en cuenta que el objeto de firma de función PEP es solo un borrador, y la terminología podría ser idea de una sola persona. Pero son buenos términos de todos modos. :)
Entonces, los argumentos
*
y**
simplemente descomprimen sus respectivas estructuras de datos:[1]: los Iterables son objetos que implementan el
__iter__()
método y las asignaciones son objetos que implementankeys()
y__getitem__()
. Cualquier objeto que admita este protocolo será entendido por los constructorestuple()
ydict()
, por lo tanto, puede usarse para desempaquetar argumentos.fuente
def f(x, *xs, y=0): pass
no es válida la sintaxis de Python 2. {5,6,7}, ni hacedef f(x, y=0, *xs):
lo que podría esperar. AFAIK, la única forma de lograr el efecto (obviamente) deseado esdef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. Python 3 maneja la sintaxis original como se esperaba.begin, *middle, end = (0, 1, 2, 3, 4, 5)
sintaxis tampoco funciona en Python 2.x.No creo que tenga nombre. En los documentos de Python en "Desempaquetado de listas de argumentos", simplemente se conoce como "el
**
operador".No estoy seguro de lo que quiere decir con "la otra" estructura de datos. Cuando lo hace
f(**kwargs)
, desempaqueta el diccionariokwargs
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.
Ver también: ¿Qué significa * args y ** kwargs?
fuente
f(**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 ayudarlo a descubrir cómo llamarlo. En este caso
**
, lo llamaríadouble-splat
, aunque hay algunos nombres alternativos para los símbolos .fuente