Curso de Python / Recopilar y desempaquetar argumentos con args y kwargs
En la definición de una función, *args reúne los argumentos posicionales adicionales en una tupla y **kwargs reúne los argumentos por nombre adicionales en un diccionario. En una llamada, * y ** expanden colecciones existentes en el sentido contrario.
Distinguir recopilación y expansión
args y kwargs son nombres convencionales; los asteriscos son los que determinan el comportamiento. No hagas variable la interfaz de todas las funciones si sus entradas son fijas y claras. Una interfaz demasiado amplia puede ocultar qué campos se aceptan y qué errores deberían rechazarse.
| Lugar | Expresión | Efecto |
|---|---|---|
| Definición | def f(*args) | Reunir argumentos posicionales adicionales |
| Definición | def f(**kwargs) | Reunir argumentos por nombre adicionales |
| Llamada | f(*values) | Expandir los elementos de un iterable en argumentos posicionales |
| Llamada | f(**options) | Expandir entradas de un mapeo con claves de texto en argumentos por nombre |
La guía oficial de listas de argumentos variables explica estas formas. Compáralas con los parámetros ordinarios y los valores predeterminados.
Ejecutar una suma variable y describir opciones
Guarda el código completo como varargs.py en UTF-8. Ejecuta python varargs.py desde la carpeta de práctica y con el entorno virtual del proyecto seleccionado. Fuera de él en macOS o Ubuntu, utiliza python3 si corresponde a tu instalación.
def total(*amounts, fee=0):
return sum(amounts) + fee
def describe(**fields):
return ", ".join(f"{key}={value}" for key, value in sorted(fields.items()))
values = [3500, 8000, 2500]
print(total(*values, fee=500))
options = {"category": "food", "currency": "KRW"}
print(describe(**options))
La salida esperada es:
14500
category=food, currency=KRW
En total(*values, fee=500), la lista se expande en tres importes y fee se proporciona por nombre. En describe(**options), cada clave del diccionario se convierte en el nombre de un argumento. La descripción ordena los pares para obtener una presentación predecible.
Detectar claves repetidas y expansiones no deseadas
Las claves expandidas mediante ** deben ser cadenas y corresponder a parámetros aceptados por la función. Una llamada f(amount=1, **{"amount": 2}) produce TypeError porque proporciona dos veces el mismo argumento. Esa regla no es equivalente a combinar diccionarios, donde puede definirse una sustitución de valores.
Expandir una cadena con * entrega un carácter cada vez. total(*"123") no pasa el entero 123. Si la colección representa una única entrada con significado propio, un parámetro de lista explícito puede comunicar mejor la intención que una cantidad arbitraria de argumentos.
En una función envolvente, def wrapper(*args, **kwargs) recopila los argumentos y func(*args, **kwargs) los vuelve a expandir. Pasar el diccionario como un argumento posicional no equivale a expandirlo con dos asteriscos.
Controlar las opciones aceptadas
Aceptar **kwargs no justifica reenviar entradas sin comprobar a una API externa o a SQL. Valida los campos obligatorios y los nombres de opciones admitidos. Aceptar silenciosamente una opción mal escrita dificulta descubrir que nunca se aplicó.
- Añade un cero a values y comprueba que el total no cambia.
- Omite fee y verifica que se utiliza su valor predeterminado cero.
- Proporciona una palabra clave expresamente y otra vez mediante un diccionario expandido, y observa el error.
Usa argumentos variables cuando representen el problema. Mantén parámetros con nombre para las opciones cuyo significado debe verse claramente en cada llamada.




