Uso de *args y **kwargs en funciones de Python

Clase 51 de 63Curso de Python

Resumen

¿Qué son los args y kwargs y cómo te ayudan en programación?

En el mundo de la programación, especialmente cuando trabajamos con funciones, nos encontramos con situaciones donde la cantidad de argumentos que vamos a recibir es incierta. Aquí es donde los args y kwargs se convierten en aliados indispensables. Estos mecanismos permiten manejar un número variable de argumentos o parámetros, otorgando flexibilidad y dinamismo a las funciones que creamos.

¿Cómo usar *args para argumentos variables?

*args es una herramienta que se utiliza para recibir un número indefinido de argumentos. En Python, cuando definimos una función y le precedemos de un asterisco *, indicamos que estamos listos para recibir múltiples argumentos.

def sum_numbers(*args):
    return sum(args)

# Llamada a la función con diferentes números de argumentos
print(sum_numbers(1, 2, 3, 4, 5))  # Retorna 15
print(sum_numbers(1, 2))           # Retorna 3
print(sum_numbers(7, 8, 9, 10))    # Retorna 34

Consideraciones:

  • Los args se almacenan en una tupla inmutable.
  • Este método es ideal cuando no se conoce de antemano la cantidad de argumentos que la función recibirá.

¿Cómo manejar argumentos con **kwargs?

Cuando se requiere trabajar con argumentos que poseen etiquetas (es decir, pares de llave y valor), el método adecuado es **kwargs. Al anteponer dos asteriscos ** a nuestra variable, indicamos que estamos preparados para recibir argumentos con nombre.

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Llamada a la función con diferentes argumentos
print_info(name="Carlos", age=30, city="Bogotá")
# Salida:
# name: Carlos
# age: 30
# city: Bogotá

Detalles importantes:

  • kwargs se almacena como un diccionario.
  • Ofrece flexibilidad para gestionar múltiples parámetros y modificarlos sin alterar la estructura de la función.

¿Cómo combinar args y kwargs en clases?

En programación orientada a objetos, también es posible emplear args y kwargs, especialmente para ofrecer flexibilidad en la inicialización de clases.

class Empleado:
    def __init__(self, name, *skills, **details):
        self.name = name
        self.skills = skills
        self.details = details

    def show_info(self):
        print(f"Name: {self.name}")
        print(f"Skills: {self.skills}")
        print(f"Details: {self.details}")

# Creación de un objeto e instancia de la clase
empleado = Empleado("Carlos", "Python", "Java", "C++", age=30, city="Bogotá")
empleado.show_info()

¿Qué es el desempaquetado y cuándo usarlo?

El desempaquetado permite extraer valores de listas o diccionarios y pasarlos a una función sin tener que especificar cada valor individualmente. Esto puede realizarse tanto con args (usando *) como con kwargs (usando **).

def suma(a, b, c):
    return a + b + c

# Desempaquetado de lista
valores = [1, 2, 3]
print(suma(*valores))  # Retorna 6

def mostrar_informacion(name, age):
    print(f"Name: {name}, Age: {age}")

# Desempaquetado de diccionario
datos = {'name': 'Carlos', 'age': 30}
mostrar_informacion(**datos)

Conclusiones y práctica recomendada

Para llevar a la práctica estos conceptos, te sugerimos crear funciones que puedan recibir listas de precios y descuentos aplicables usando *args y **kwargs. La clave está en discernir cuándo es necesario un enfoque u otro y cómo podemos sacar provecho del dinamismo que ofrecen estos mecanismos.

La programación con args y kwargs no solo ofrece mayor flexibilidad, sino que también mejora la legibilidad y eficiencia de nuestro código. Anímate a continuar explorando estos conceptos y aplicarlos en tus proyectos diarios.