17 · *args, **kwargs, anotaciones de tipo, docstrings
Escribe funciones flexibles y autodocumentadas — args variádicos, parámetros solo-keyword, anotaciones de tipo y docstrings estilo NumPy.
`*args` recolecta cualquier número de argumentos posicionales en una tupla; `**kwargs` recolecta cualquier número de argumentos de palabra clave en un dict. Juntos permiten que una función acepte una firma abierta — la columna vertebral de los estimadores de scikit-learn y las capas de PyTorch.
Sin esto:
Sin `**kwargs`, toda función envolvente que pasa configuración a una llamada interna debe enumerar cada hiperparámetro posible por nombre — agregar uno nuevo rompe el envolvente. `**kwargs` hace que los envoltorios sean a prueba de futuro.
*args en la firma de una función agrupa todos los argumentos posicionales extra en una tupla llamada args. **kwargs agrupa todos los argumentos de palabra clave extra en un dict llamado kwargs. Ambos son convenciones de nombre — la sintaxis real son los prefijos * y **. También puedes usar * y ** en el sitio de llamada para desempaquetar una lista o dict en argumentos: f(*mi_lista), f(**mi_dict). Los parámetros solo-keyword vienen después de un * desnudo: def f(a, *, key): — key siempre debe pasarse por nombre. Los parámetros solo-posicionales vienen antes de un /: def f(a, /, b): — a no puede pasarse por nombre.
Python (in browser)
`*args` es una tupla dentro del cuerpo de la función — puedes iterarla, cortarla o pasarla con `f(*args)`. El nombre `args` es una convención; `*values` funciona igual.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`**kwargs` es un dict normal dentro del cuerpo de la función. Desempaquetar un dict en el sitio de llamada con `f(**d)` es como scikit-learn y PyTorch aceptan grids de parámetros flexibles.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Las anotaciones de tipo como `list[float]` y `-> dict[str, float]` documentan el contrato pero **no se aplican en tiempo de ejecución**. Herramientas como mypy, pyright y tu IDE las usan para análisis estático.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Los docstrings estilo NumPy (secciones Parameters / Returns / Examples) son el estándar de facto en bibliotecas de ciencia de datos. Los IDEs los renderizan como documentación enriquecida en los tooltips.
¿Qué hace llamar a `f(**{"a": 1, "b": 2})`?
- `*args` → argumentos posicionales extra como tupla; `**kwargs` → argumentos de palabra clave extra como dict. Usa `*` y `**` en el sitio de llamada para desempaquetar secuencias y dicts.
- Los parámetros solo-keyword (`def f(*, key):`) siempre deben pasarse por nombre — útil para flags que nunca deben pasarse por accidente.
- Las anotaciones de tipo documentan la intención pero no la aplican en tiempo de ejecución. Usa mypy/pyright para chequeo estático. Los docstrings estilo NumPy son el estándar en Python científico.
scikit-learn pasa grids de hiperparámetros como `**params` a los constructores de estimadores — `SVC(**{'C': 1.0, 'kernel': 'rbf'})`. Las anotaciones de tipo documentan formas de tensores en módulos de PyTorch. `**config` desempaqueta archivos YAML de experimentos cargados con PyYAML en funciones de entrenamiento. El `model.fit(**training_args)` de Keras usa el mismo patrón.
Si lo quitas: Sin `**kwargs`, un envoltorio que pasa configuración a una llamada anidada debe codificar cada nombre de parámetro. Cada vez que se agrega un nuevo hiperparámetro, el envoltorio se rompe — haciendo las APIs de bibliotecas frágiles y obligando a los usuarios a actualizar los sitios de llamada en todo el codebase.