Cómo utilizar *args y **kwargs en funciones de Python

Domina *args y **kwargs en Python. Aprenda a escribir funciones flexibles con argumentos dinámicos posicionales y de palabras clave, descomprimir colecciones y crear funciones contenedoras.

Pruebe esta solución en el Editor

Descripción general

En Python, a menudo necesitarás diseñar funciones que puedan aceptar una cantidad variable de argumentos. Por ejemplo, una función que calcula la suma de cualquier número de números enteros o una función que registra metadatos con diferentes campos. En lugar de obligar a los usuarios a pasar una lista o diccionario, Python proporciona dos símbolos especiales: `*args` y `**kwargs`.

La sintaxis `*args` permite que una función acepte cualquier número de argumentos posicionales. El único asterisco `*` actúa como operador de desembalaje. Cuando se coloca en la definición de una función, recopila argumentos posicionales adicionales en una tupla llamada "args". Esto le permite iterar sobre los valores de entrada, ejecutar cálculos o pasarlos a otra función con facilidad.

La sintaxis `**kwargs`, por otro lado, permite que una función acepte cualquier número de argumentos de palabras clave (con nombre). El doble asterisco `**` recopila estos argumentos en un diccionario llamado `kwargs`. Esto es increíblemente útil para pasar configuraciones opcionales, argumentos de estilo o atributos de bases de datos. Recuerde, los nombres 'args' y 'kwargs' son convenciones; la funcionalidad real está impulsada por los asteriscos simples y dobles.

Código y salida de ejecución

Este código demuestra el uso de *args para sumar números de variables, **kwargs para imprimir perfiles de usuario y la combinación de ambos en una sola función.

def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

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

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
Salida terminal
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

Implementación paso a paso

  • Utilice un solo asterisco antes de un parámetro (por ejemplo, *args) para reunir argumentos posicionales en una tupla.
  • Utilice un asterisco doble antes de un parámetro (por ejemplo, **kwargs) para recopilar argumentos de palabras clave en un diccionario.
  • Mantenga el orden correcto de los parámetros: parámetros estándar, *args, parámetros de solo palabras clave y luego **kwargs.
  • Utilice la sintaxis de descompresión al llamar a funciones pasando *iterable o **diccionario.

Preguntas frecuentes

¿Tengo que utilizar los nombres "args" y "kwargs"?

No, estas son convenciones comunitarias estándar. Sintácticamente sólo se requieren los prefijos * y **. Podría escribir *valores y **opciones, pero se recomienda encarecidamente atenerse a *args y **kwargs para facilitar la lectura.

¿Cuál es el orden correcto al definir una función?

El orden correcto de los argumentos en la firma de una función es: argumentos posicionales, *args, argumentos de solo palabras clave y finalmente **kwargs.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.