*args y **kwargs – python, con ejemplos
Cuando empiezas con algún lenguaje de programación; como es el caso de Python, solemos aprenderlo de forma práctica (programando), pasando por alto el aprendizaje teórico del propio lenguaje. Una de las cosas que todos hemos pasado por alto al empezar a aprender Python y que más llaman la atención, son las funciones (o métodos) que tienen como parámetro *args y **kwargs. Para entender su funcionamiento es necesario que previamente tengas claro los conceptos de Lista y Diccionario en Python.
**kwargs: es un diccionario cuyas claves se convierten en parámetros y sus valores en los argumentos de los parámetros.
Hay que destacar que la sintaxis es * y **, siendo los nombres de args y kwargs una simple convención, pero no es un requisito estricto su uso; es decir, que si a una función le pasamos como argumento *mi_lista o **mi_diccionario tendrá el mismo efecto.
*args, se usara cuando no se este seguro de cuantos argumentos se tengan que pasar a la función; es decir, te permite pasar una cantidad arbitraria de argumentos. Veamos a continuación un ejemplo:
def read_list_args(*args): for count, arg in enumerate(args): print '%d - %s' % (count, arg) print 'First' read_list_args('Ricardo', 'jarroba.com') print 'Second' read_list_args('Ricardo', 23, 'Ramon', [1, 2, 3], 'jarroba.com')
Como podemos observar, llamamos a la función con distinto número de argumentos, siendo la salida de la función la siguiente:
First 0 - Ricardo 1 - jarroba.com Second 0 - Ricardo 1 - 23 2 - Ramon 3 - [1, 2, 3] 4 - jarroba.com
De forma similar cuando no se sepa el número de argumentos de va a recibir una función, **kwargs acepta argumento para parámetros con nombres que no han sido definidos de antemano. Veamos a continuación un ejemplo:
def read_dict_args(**kwargs): for key, value in kwargs.items(): print '%s - %s' % (key, value) print 'First' read_dict_args(name1='Ricardo', name2='Ramon', web='jarroba.com') print 'Second' read_dict_args(Team='FC Barcelona', player='Iniesta', demarcation='Right winger', number=8)
Como salida de este código tenemos los siguiente:
First web - jarroba.com name2 - Ramon name1 - Ricardo Second player - Iniesta number - 8 demarcation - Right winger Team - FC Barcelona
Tanto * y ** pueden ser usados juntos y junto a otros parámetros definidos en la función, pero en este caso si que importa la precedencia. En primer lugar van los parámetros definidos para la función, en segundo lugar *args y en tercer lugar **kwargs:
def do_something(a, b, *args, **kwargs):
Nota: ¿Que es un parámetro y que es un argumento?
En este post se ha utilizando en varias ocasiones las palabras parámetro y argumento. Es importante saber la diferencia que hay entre estas dos palabras ya que es relativamente sencillo confundirlas y mucha gente creen que son sinónimos dentro del contexto de la programación:
- Parámetro: Se especifican en la definición de la función o método.
- Argumento: Es el valor que se le asigna a los parámetros cuando se llama a la función.
def something(parameter1, parameter2): ... something(parameter1=argument1, parameter2=argument2)