HOWTO · Python
Pasar Kwargs a otra función en Python
Aprende cómo funcionan los argumentos de palabra clave en Python, cómo `**kwargs` los recopila en un diccionario y cómo reenviar ese diccionario a otra función.
En esta página
Para pasar un diccionario de argumentos con nombre a otra función de Python, llámala con **mapping, como en display(**details). Python desempaqueta cada par clave-valor y lo convierte en un argumento con nombre. Una función puede recopilar un conjunto variable de estos argumentos mediante un parámetro **kwargs y reenviarlos del mismo modo.
Argumentos de palabra clave en Python
Los argumentos de palabra clave asocian valores con nombres de parámetros en una llamada a función. Escribe cada uno como name=value; por ejemplo, greet(first="Anne", age=27) pasa los valores por nombre. La función debe definir parámetros que acepten esos nombres, y los valores se asignan a los parámetros correspondientes independientemente de su posición en la llamada.
Este estilo facilita la lectura de las llamadas cuando una función tiene varios parámetros. También permite especificar solo los parámetros opcionales y dejar sin cambios los que tienen valores predeterminados. Los nombres de una llamada con argumentos de palabra clave deben coincidir con los nombres de los parámetros de la función, salvo que esta acepte otros mediante **kwargs.
Llamar a una función con **kwargs en Python
Añade ** delante del nombre de un parámetro en la definición de una función para recopilar los argumentos con nombre que no tienen parámetros individuales. Por convención, este parámetro se llama kwargs, aunque puede tener cualquier nombre de variable válido. Dentro de la función, Python ofrece los valores recopilados como un diccionario.
Por ejemplo, def describe(**kwargs): ... puede recibir una llamada como describe(name="Rabbit", sound="squeak"). El diccionario resultante tiene dos entradas: name asociado a "Rabbit" y sound asociado a "squeak". Así, una función puede aceptar opciones con nombre sin enumerarlas todas en su firma. Puede consultar el diccionario, seleccionar valores o pasarlo a otra función.
*args cumple una función relacionada con los argumentos posicionales: recopila los valores posicionales adicionales en una tupla. Usa *args para los valores posicionales y **kwargs para los valores con nombre; **args no es la forma correspondiente para recopilar argumentos posicionales.
Pasar **kwargs a otra función en Python
Una función puede reenviar un diccionario colocando ** delante del nombre del diccionario en la llamada. En el ejemplo, info recopila details y luego lo desempaqueta al llamar a show_details. La función llamada recibe las entradas del diccionario como parámetros con nombre mediante su propio parámetro **kwargs.
def show_details(**kwargs):
for key, value in kwargs.items():
print(key, value)
def info(**kwargs):
show_details(**kwargs)
details = {"name": "Shen", "age": 27, "degree": "SE"}
info(**details)
name Shen
age 27
degree SE
La llamada info(**details) desempaqueta el mapeo en argumentos con nombre para info. Esa función los recopila en su diccionario local kwargs, y show_details(**kwargs) desempaqueta las mismas entradas para la siguiente llamada. El bucle muestra cada clave junto con su valor: name con Shen, age con 27 y degree con SE. Las etiquetas visibles de la salida permanecen en inglés porque el bloque de salida es idéntico al del artículo canónico. Asegúrate de que las claves del diccionario coincidan con los nombres que acepta la función receptora; si esta declara parámetros explícitos, cada clave debe coincidir con uno de ellos o ser aceptada por su parámetro **kwargs.
La función que reenvía los argumentos no necesita conocer de antemano cada clave. Este patrón resulta útil en funciones envoltorio que añaden comportamiento alrededor de otra llamada y, a la vez, pasan las opciones proporcionadas por quien las llama. Si una función envoltorio también tiene parámetros explícitos, defínelos antes de **kwargs en su firma y reenvía después los argumentos con nombre recopilados que sean necesarios.
Conclusión
Usa name=value para pasar un argumento con nombre normal, **kwargs en una definición para recopilar argumentos con nombre adicionales en un diccionario y **mapping en una llamada para desempaquetar un diccionario al llamar a otra función. Para los argumentos posicionales, usa *args. Para reenviar argumentos de forma fiable, las claves del mapeo deben coincidir con los nombres de parámetros que acepta la función receptora.