Cuando construyes funciones o métodos en Python, no siempre sabes de antemano cuántos datos vas a recibir. Dominar el uso de args y kwargs te permite escribir código flexible que acepta una cantidad variable de argumentos, ya sea sin nombre o con nombre. A continuación se explican estas técnicas con ejemplos prácticos que incluyen funciones y clases.
¿Cómo funcionan los args para recibir argumentos sin nombre?
Los args (precedidos por un asterisco *) permiten que una función reciba un número indefinido de argumentos no posicionales, es decir, sin asignarlos a una variable específica. Internamente, Python los almacena en una tupla, lo que significa que son inmutables [01:36].
El nombre args es una convención; podrías usar cualquier otro, pero por buenas prácticas se mantiene este. Veamos un ejemplo sencillo:
Cada invocación pasa una cantidad distinta de parámetros y la función los procesa sin problemas [02:25]. La clave está en el asterisco antes del nombre: le indica a Python que agrupe todo lo que llegue en una tupla.
¿Qué son los kwargs y cuándo se usan argumentos con nombre?
Los kwargs (keyword arguments) se declaran con doble asterisco** y reciben argumentos posicionales con nombre, es decir, pares clave=valor. Python los almacena en un diccionario [03:22].
python
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Carlos", age=30, city="Bogotá")
Si después necesitas agregar más datos, como country="Colombia", la función los acepta sin modificar su definición [04:40]. Esto resulta muy útil cuando la estructura de información puede crecer o variar entre llamadas.
¿Cómo combinar parámetros directos, args y kwargs en una clase?
Es posible mezclar las tres técnicas en un mismo constructor o método. Se define primero el parámetro directo, luego *args y finalmente **kwargs [05:17].
python
class Employee:
def init(self, name, *args, **kwargs):
self.name = name
self.skills = args
self.details = kwargs
"Python", "Java" y "C++" van a args como tupla porque no tienen nombre.
age=30 y city="Bogotá" van a kwargs como diccionario porque sí tienen nombre [06:55].
Esta separación permite que cada empleado tenga un número diferente de skills y de detalles adicionales.
¿Qué es el desempaquetado de args y kwargs?
Cuando la información ya existe en una variable externa, puedes desempaquetarla al pasarla a una función [08:05].
¿Cómo desempaquetar una lista con un solo asterisco?
python
def add(a, b, c):
return a + b + c
values = (1, 2, 3)
print(add(*values)) # 6
El asterisco antes de values extrae cada elemento de la tupla y lo coloca como argumento independiente.
¿Cómo desempaquetar un diccionario con doble asterisco?
python
def show_info(name, age):
print(f"{name} tiene {age} años")
data = {"name": "Carlos", "age": 30}
show_info(**data)
El doble asterisco descompone el diccionario en pares clave=valor que coinciden con los parámetros de la función [09:00].
¿Cuándo elegir args y cuándo kwargs?
Usa *args cuando recibas valores sin etiqueta, como una lista de precios o puntuaciones.
Usa **kwargs cuando necesites pares clave-valor, como configuraciones, descuentos o metadatos.
Combínalos con parámetros directos cuando haya datos que siempre sean obligatorios.
Como reto, intenta crear una función que reciba una cantidad variable de precios con *args y un descuento opcional con **kwargs, aplicando ese descuento a los productos indicados. La práctica te ayudará a identificar rápidamente cuál técnica usar en cada situación. ¿Qué combinación te resultó más útil? Comparte tu solución en los comentarios.