*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.

     *args: es una lista de argumentos, como argumentos posicionales.
 
     **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)

Referencias:

Comparte esta entrada en:
Safe Creative #1401310112503
*args y **kwargs – python, con ejemplos por "www.jarroba.com" esta bajo una licencia Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies

ACEPTAR
Aviso de cookies