Me llegó un mail consultando sobre args
y *kwargs
en Python. ¿Qué es eso? Vamos por partes.
En Python existen varias formas de llamar a una función. Por ejemplo, en su definición puede tener valores por defecto, entonces no es necesario utilizarlos todos al llamarla:
>>> def f(a, b, c=3):
... print a, b, c
...
>>> f(1,2)
1 2 3
Se pueden utilizar palabras claves como argumento, por supuesto, respetando algunas reglas:
>>> def f(a, b, c):
... print a, b, c
...
>>> f(a=1, b=2, c=3)
1 2 3
>>> f(a=1, 2, 3)
File "", line 1
SyntaxError: non-keyword arg after keyword arg
>>> f(1, 2, b=3)
Traceback (most recent call last):
File "", line 1, in
TypeError: f() got multiple values for keyword argument 'b'
>>> f(1, b=2, c=3)
1 2 3
Y finalmente, se puede llamar con listas arbitrarias de argumentos. Como en los casos anteriores, poder hacerlo depende de cómo hayamos definido la función:
>>> def f(*args, **kwargs):
... print "args:", args
... print "kwargs:", kwargs
...
Con args
se indica, mapear todos los argumentos posicionales a una tupla llamada args
. Y con *kwargs
se indica, mapear todos los argumentos de palabra clave a un diccionario llamado kwargs
.
>>> f(1,2,3)
args: (1, 2, 3)
kwargs: {}
>>> f(1,2,3, cuatro=4)
args: (1, 2, 3)
kwargs: {'cuatro': 4}
>>> f(cuatro=4)
args: ()
kwargs: {'cuatro': 4}
Notemos que se pueden definir argumentos con nombre propio antes de los argumentos agrupados y que no es necesario usar exactamente los nombres args
y kwargs
. También puede usarse solo uno de los dos:
>>> def f(p, *a, **kw):
... print "p:", p
... print "a:", a
... print "kw:", kw
...
>>> f(1,2,3)
p: 1
a: (2, 3)
kw: {}
>>> f(1,2,3, cuatro=4)
p: 1
a: (2, 3)
kw: {'cuatro': 4}
>>> f(cuatro=4)
Traceback (most recent call last):
File "", line 1, in
TypeError: f() takes at least 1 non-keyword argument (0 given)
Espero que los ejemplos sirvan. Para más detalle, se pueden consultar las secciones del Tutorial de Python que enlacé.