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