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