Entendiendo *args y **kwargs en Python
Este post fue migrado de un blog hecho con Wordpress. Si se ve mal, dejame un comentario y lo arreglo.
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é.
Comentarios
Comments powered by Disqus