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:
- "la sintaxis de desempaquetado del argumento de palabra clave"
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 en a, *middle, end = my_tuple
, diría "desempaquetado de tuplas" .
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 *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:
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 __iter__()
método y las asignaciones son objetos que implementan keys()
y __getitem__()
. Cualquier objeto que admita este protocolo será entendido por los constructores tuple()
y dict()
, por lo tanto, puede usarse para desempaquetar argumentos.