Uso de *args y **kwargs en Python3

 

Al definir una función, los parametros definen la cantidad de argumentos que esta puede aceptar al ser llamada.

Sin embargo, al programar una función, no siempre es posible predecir todos los escenarios en que puede llegar a utilizarse, implicando también que desconocemos la cantidad de argumentos que puede llegar a recibir.

Para estos casos, utilizaremos *args y **kwargs en nuestro código, que nos permiten aceptar un número indeterminado de argumentos para nuestra función.

Uso de *args en Python 3

En python *args (con un solo asterisco) es utilizado como parametro para recibir argumentos sin palabras clave en nuestra función. Es importante notar que la parte importante de la sentencia es el asterisco (*), mientras que la palabra args puede variar.

Por ejemplo, una función suma() convencional en Python luce así:

Salida:

suma(1,2)
Resultado: 3

Sin embargo, la función anterior nos limita únicamente a dos sumandos, y para poder añadir más, sería necesario definir más parametros. Si queremos hacer una función suma() que reciba un número indeterminado de argumentos sin nombre, utilizaremos *args como parametro.

Al utilizar el parametro *args, los argumentos serán recibidos por la función como una tupla, por lo que requeriremos iterar sobre ellos para realizar la suma, la nueva función suma() quedaría así:

Salida:

suma(1,2,3,4)
Resultado: 10

De esta forma, la función realizará la operación sin importar cuantos argumentos reciba.

Como *args crea una tupla con los argumentos de la función, podemos pasar cualquier tupla a la función añadiendo un asterisco (*) antes de su nombre, y la función tomará el contenido de la tupla como parametros, por ejemplo, con la función anterior:

Salida:

sumandos = (10, 20, 30, 40, 50)
suma(*sumandos)
Resultado: 150

Uso de **kwargs en Python 3

Cuando usamos dos asteriscos en **kwargs (Keyword Arguments), la función recibe los argumentos como un diccionario, por lo que es necesario especificar el nombre del argumento y su valor.

Por ejemplo, la siguiente función que imprime una lista de nombres:

Salida:

nombres(nombre1 = "Python", nombre2 = "Guido", nombre3 = "Usb")
Nombre 1 Guido
Nombre 2 Usb
Nombre 3 Python

De igual forma que podemos pasar cualquier tupla a cualquier función con *args, podemos pasar cualquier diccionar a cualquier función que acepter **kwargs tan sólo añadiendo dos astericos como prefijo al pasar el diccionario como argumento:

Salida:

personas = {'nombre1':'Alan', 'nombre2':'Dennis', 'nombre3':'John'}
nombres(**personas)
Nombre 1 Dennis
Nombre 2 John
Nombre 3 Alan

Dependiendo de la versión de Python que utilices, los diccionarios pueden ser una estructura de datos ordenada (Python 3.6 o superior) o desordenada (Python 3.5 e inferior).

Tags:

Share Post :

More Posts