Cómo utilizar *args y **kwargs en Python: Consejos prácticos

Go to Homepage

Utilizar *args y **kwargs en Python es necesario para manejar diferentes tipos de datos de manera dinámica

Al programar en Python, es muy común encontrarse con situaciones en las que necesitamos manejar múltiples argumentos de diferentes tipos y cantidades. Ahí es donde entra en acción *args y **kwargs, un par de funciones muy útiles que permiten manejar estos casos de manera dinámica.

La función *args permite pasar una cantidad variable de argumentos que serán recogidos en forma de una tupla. Por ejemplo, si tenemos una función que suma cualquier cantidad de números, podríamos utilizar *args de la siguiente manera:

def sumar_numeros(*args):
    total = 0
    for numero in args:
        total += numero
    return total

sumar_numeros(5, 10, 20, 30) # 65
sumar_numeros(1, 3, 5, 7, 9) # 25

Como vemos, al utilizar *args podemos enviar cualquier cantidad de números como argumentos y la función los sumará sin importar la cantidad.

Por su parte, **kwargs también permite manejar argumentos variables, pero en este caso serán recogidos en forma de un diccionario, en el que cada argumento tiene un nombre. Con esto se puede pasar información adicional en forma de clave-valor. Un ejemplo de uso de **kwargs sería el siguiente:

def crear_persona(nombre, edad, **kwargs):
    persona = {'nombre': nombre, 'edad': edad}
    for clave, valor in kwargs.items():
        persona[clave] = valor
    return persona

crear_persona('Eduardo', 27, ciudad='Lima', profesion='Ingeniero')

# devuelve:
# {'nombre': 'Eduardo', 'edad': 27, 'ciudad': 'Lima', 'profesion': 'Ingeniero'}

Como se puede ver, al utilizar **kwargs podemos pasar argumentos adicionales de manera dinámica, lo que resulta muy útil en aquellos casos en los que querramos enviar información adicional sin necesidad de modificar la función en sí misma.

Utilizar *args y **kwargs en Python es una técnica muy útil que permite manejar argumentos de manera dinámica y flexible, sin necesidad de limitarnos a una cantidad o tipo fijo de argumentos. Al dominar estas funciones, tendremos una herramienta poderosa que nos permitirá escribir código más limpio y efectivo. Así que, si aún no has explorado las posibilidades de *args y **kwargs, te animo a que lo hagas y descubras por ti mismo lo útiles que pueden ser.

Con *args podemos pasar argumentos posicionales de manera flexible sin tener que definirlos en la función

Cuando programamos en Python, a menudo encontramos situaciones en las que no sabemos de antemano cuántos argumentos vamos a necesitar en nuestras funciones. En estos casos, *args resulta una herramienta muy útil que nos permite pasar argumentos posicionales de manera flexible sin tener que definirlos en la función.

En términos simples, *args es un parámetro especial que nos permite pasar cualquier número de argumentos posicionales a una función en un solo llamado. Podemos pensar en *args como una especie de cajón de sastre, en el que podemos colocar todos los argumentos que necesitemos y enviarlos juntos a la función. De esta forma, evitamos tener que escribir una cantidad excesiva de parámetros en nuestra función, lo que nos permite hacer el código más limpio y fácil de leer.

Para utilizar *args en Python, lo que debemos hacer es crear una función y agregar el parámetro *args al final de la lista de argumentos. Veamos un ejemplo:

def mi_funcion(*args):
    for elemento in args:
        print(elemento)

mi_funcion("Hola", "Mundo", 2022)

En este ejemplo, creamos una función llamada mi_funcion y agregamos el parámetro *args al final de los argumentos. Luego, dentro de la función, utilizamos un bucle for para recorrer los argumentos y mostrarlos en la pantalla. Por último, llamamos a la función y le pasamos tres argumentos: “Hola”, “Mundo” y 2022.

Como resultado, en la pantalla vemos los tres argumentos que hemos pasado a la función:

Hola
Mundo
2022

Además de permitirnos pasar cualquier número de argumentos posicionales a una función, *args también nos da la flexibilidad de usar cualquier nombre que queramos para el parámetro. Por ejemplo, en lugar de llamarlo *args, podríamos llamarlo *mensajes o *valores, dependiendo del contexto en el que se esté utilizando.

*args es una herramienta muy útil para aquellos casos en los que necesitamos pasar un número variable de argumentos posicionales a una función. Esta herramienta nos permite hacer el código más limpio y fácil de leer, y nos da la flexibilidad de usar cualquier nombre que queramos para el parámetro. En definitiva, *args es una herramienta muy poderosa que todos los programadores de Python deberían tener en su caja de herramientas.

Usa **kwargs para pasar argumentos de palabra clave de manera dinámica y accesible desde cualquier contexto

**kwargs es una función en Python que nos permite pasar argumentos de palabra clave de manera dinámica. Esto significa que podemos usarla para enviar múltiples argumentos donde solo conocemos algunos de los nombres de los argumentos.

En términos simples, **kwargs nos permite crear una lista de argumentos de palabra clave que se pueden acceder desde cualquier contexto.

Digamos que tenemos una función llamada “agrega_empleado” que acepta varios argumentos como nombre, apellido, edad, cargo, etc. Pero, ¿qué sucede si queremos agregar un nuevo campo a la función, como el salario? No podemos simplemente agregarlo a la lista de argumentos si ya se están usando muchos argumentos. Es aquí donde **kwargs nos viene al rescate.

Para utilizar **kwargs, solo tienes que agregar **kwargs al final de la lista de argumentos de la función. De esta manera, cualquier argumento adicional pasado a la función se almacenará automáticamente en la variable **kwargs.

def agrega_empleado(nombre, apellido, edad, **kwargs):
    print("Nombre:", nombre)
    print("Apellido:", apellido)
    print("Edad:", edad)
    for key, value in kwargs.items():
        print(key, ":", value)

Aquí, la función “agrega_empleado” acepta los argumentos de entrada nombre, apellido y edad. A continuación, a través del uso de **kwargs, podemos agregar cualquier número de argumentos de palabra clave adicionales. En este caso, estamos imprimiendo la lista de argumentos de palabra clave utilizando un bucle.

Al llamar a la función “agrega_empleado”, podemos pasar cualquier número de argumentos adicionales como pares de llave-valor.

agrega_empleado("Juan", "Pérez", 35, cargo="Gerente", salario=100000)

La salida de este ejemplo sería:

Nombre: Juan
Apellido: Pérez
Edad: 35
cargo : Gerente
salario : 100000

Esto muestra cómo podemos pasar argumentos de palabra clave de manera dinámica utilizando **kwargs. De esta manera, podemos agregar cualquier número de argumentos a la función sin tener que reutilizar los mismos.

**kwargs es una herramienta poderosa y útil en Python que nos permite pasar argumentos de palabra clave de manera dinámica y accesible desde cualquier contexto. Con poco esfuerzo podemos convertir una función común en una función más poderosa y versátil.

Puedes combinar ambos para crear funciones más versátiles y escalables

Si bien *args y **kwargs son muy útiles por sí solos, combinarlos puede hacer que tus funciones sean aún más poderosas. En esta sección, explicaré cómo puedes combinar ambas técnicas para crear funciones más versátiles y escalables.

Usando *args y **kwargs juntos

La combinación de *args y **kwargs es simple: si presenta ambos como argumentos de una función, *args tomará la mayoría de las entradas posicionales no clave y **kwargs se encargará de cualquier argumento nominal adicional.

Aquí hay un ejemplo simple:

def mi_funcion(*args, **kwargs):
  for arg in args:
    print(arg)
  for key in kwargs:
    print(key, kwargs[key])

En este caso, *args inicia el ciclo de la función, mientras que **kwargs lo modifica. El uso de ambos permite que la función acepte cualquier número de argumentos posicionales y nominales.

Para utilizar esta función, podemos llamarla de la siguiente manera:

mi_funcion(1, 2, 3, nombre="Juan", edad=25)

Esto imprimirá:

1
2
3
nombre Juan
edad 25

Un ejemplo más complejo

Veamos un ejemplo más complejo que involucra el uso de *args y **kwargs. Supongamos que queremos crear una función que acepte dos parámetros: un monto de dinero y una tasa de interés. La función debe devolver el valor futuro del monto después de un cierto número de años.

Podemos hacer esto de la siguiente manera:

def valor_futuro(monto, tasa, tiempo, *args, **kwargs):
  interes_compuesto = kwargs.get('interes_compuesto', False)
  if interes_compuesto:
    monto *= (1 + tasa) ** tiempo
  else:
    monto *= 1 + (tasa * tiempo)
  return monto

En este caso, monto y tasa son parámetros obligatorios, mientras que tiempo es un parámetro posicional opcional. *args y **kwargs se utilizan para permitir argumentos adicionales como si el interés es o no compuesto, lo que hará que la función aplique diferentes fórmulas.

Si queremos usar esta función, podemos llamarla de la siguiente manera (sin interés compuesto):

valor_futuro(1000, 0.05, 10)

Esto devolverá:

1500.0

Si queremos usar esta función con interés compuesto, podemos hacerlo de la siguiente manera:

valor_futuro(1000, 0.05, 10, interes_compuesto=True)

Esto devolverá:

1628.89

La combinación de *args y **kwargs en una función nos permite escribir funciones más versátiles y escalables. Al usar ambos, podemos aceptar cualquier número de argumentos posicionales y nominales. Considera agregar esta técnica a tu conjunto de habilidades de Python si planeas escribir funciones complejas.

Recuerda documentar tus funciones para asegurarte de que otros puedan entender su uso y propósito

Cuando trabajas con *args y **kwargs en Python, es importante que también documentes adecuadamente tus funciones. De esta manera, otros desarrolladores sabrán cómo usar tus funciones y entenderán su propósito sin tener que profundizar en el código.

La documentación adecuada también facilitará el trabajo en equipo. Si estás trabajando en un proyecto con otros desarrolladores, documentar la función permitirá que todos estén en la misma página sobre lo que la función hace y cómo usarla.

Aquí hay algunos consejos para documentar tus funciones de manera efectiva:

Usa el Docstring

El docstring es una cadena de texto que se coloca al principio de una función y proporciona una descripción clara y concisa de lo que hace la función. Puedes incluir detalles como los argumentos que debe recibir la función, lo que hace la función y cualquier valor de retorno que devuelva.

Aquí hay un ejemplo de cómo agregar un docstring a una función:

def sumar_numeros(*args):
    """
    Esta función toma cualquier cantidad de números y los suma.
    Retorna la suma total.
    """
    total = 0
    for numero in args:
        total += numero
    return total

Especifica los Argumentos

Es importante especificar los argumentos que debe recibir la función. Esto hace que sea más claro para otros desarrolladores lo que se espera de la función.

Además, proporcionar información sobre los argumentos puede ayudar a los desarrolladores a entender mejor cómo usar la función. Puedes incluir detalles como el tipo de datos que debe recibir el argumento y lo que se espera que haga el argumento.

Aquí hay un ejemplo de cómo especificar los argumentos de una función:

def multiplicar_numeros(*args, factor:int=1):
    """
    Esta función toma una cantidad variable de números y los multiplica por un factor.
    Retorna una lista de los números multiplicados por el factor.

    :param args: Los números a multiplicar por el factor.
    :param factor: El número por el cual se multiplicarán los números. Por defecto es 1.
    """
    resultados = []
    for numero in args:
        resultados.append(numero * factor)
    return resultados

En este ejemplo, se especifica que la función tomará una cantidad variable de argumentos (*args) y un argumento llamado “factor” que es un número entero. También se indica que el valor por defecto de “factor” es 1.

Usa Anotaciones de Tipos

Las anotaciones de tipos son una forma útil de proporcionar información sobre los tipos de datos que se esperan en una función. Esto hace que sea más fácil entender cómo utilizar los argumentos y valores de retorno de la función.

Las anotaciones de tipos no son necesarias para que una función funcione correctamente, pero pueden hacer la documentación más clara y fácil de entender para los demás.

Aquí hay un ejemplo de cómo utilizar anotaciones de tipos:

def concatenar_strings(*args:str) -> str:
    """
    Concatena una lista de cadenas de texto y devuelve una sola cadena de texto.

    :param args: Una lista de cadenas de texto para concatenar.
    :returns: Una cadena de texto formada por la concatenación de las cadenas de texto de la lista.
    """
    resultado = ""
    for cadena in args:
        resultado += cadena
    return resultado

En este ejemplo, las anotaciones de tipos se utilizan para indicar que los argumentos de la función (*args) y el valor de retorno (resultado) deben ser cadenas de texto.

Documentar tus funciones es una parte importante del proceso de desarrollo de Python. Utiliza el docstring para proporcionar una descripción clara y concisa de la función. Especifica los argumentos y utiliza anotaciones de tipos para hacer que la función sea más clara y fácil de entender. Al hacer esto, estarás creando funciones que son más fáciles de usar y entender para otros desarrolladores.

Otros Artículos