*args y **kwargs

*args

Python proporciona una forma de manejar cantidades arbitrarias de argumentos en una función mediante símbolos especiales. Estos símbolos son * y **, y se usan delante de los nombres de variables para denotar *args y **kwargs respectivamente. Puedes asignar cualquier nombre a los parámetros *args o **kwargs, pero por convención se les llama args (arguments) y kwargs (keyword arguments).
*args se utiliza para enviar a la función un número arbitrario de argumentos sin palabras clave. Aquí tienes un ejemplo:
def add(*args):
    res = 0             # Inicializa el resultado final a 0
    for num in args:    # Recorre la lista de argumentos pasados
        res += num      # Suma cada número al total
    return res

print(add(3, 5, 7, 9))  # 24
En este programa, args es una tupla con los valores que pasamos a la función. Así, en el ejemplo anterior, args equivale a (3, 5, 7, 9). De esta manera, podemos pasar cualquier cantidad de argumentos a nuestra función.

**kwargs

**kwargs nos permite pasar un número arbitrario de argumentos con palabras clave. En otras palabras, usamos **kwargs para enviar cualquier cantidad de argumentos nombrados a nuestra función. Aquí tienes un ejemplo:
def introduce(**kwargs):
    for key, value in kwargs.items():  # Recorre todos los pares clave-valor
        print(f'{key}: {value}')       # Imprime cada par clave-valor

introduce(Name='Alice', Age=25, Country='USA')  
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'
En el programa anterior, kwargs es un diccionario con los pares clave-valor que pasamos a la función. Así, en el ejemplo, kwargs equivale a {'Name': 'Alice', 'Age': 25, 'Country': 'USA'}.
También puedes combinar *args y **kwargs en una llamada a función. *args debe colocarse antes de **kwargs.
def combined_example(*args, **kwargs):
    print(args)    # Imprime la tupla de argumentos
    print(kwargs)  # Imprime el diccionario de argumentos con palabras clave

combined_example(1, 2, 3, Name='Alice', Age=25)  
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}
En esta función, args es una tupla con los valores (1, 2, 3) y kwargs es un diccionario con los valores {'Name': 'Alice', 'Age': 25}.
Esta flexibilidad para manejar cualquier cantidad de argumentos y argumentos con palabras clave puede ser muy útil cuando quieres que tus funciones sean más dinámicas y versátiles.

Combinando *args y **kwargs con argumentos regulares de función

*args y **kwargs pueden usarse junto con argumentos regulares de función. En estos casos, debes tener en cuenta algunas reglas:
  1. El orden correcto de los argumentos en la definición de la función debe ser: argumentos estándar, *args, y luego **kwargs.
  1. Los argumentos estándar (también conocidos como argumentos posicionales) siempre deben especificarse antes de *args y **kwargs.
def function_example(a, b, *args, **kwargs):
    print(a)       # Imprime el primer argumento estándar
    print(b)       # Imprime el segundo argumento estándar
    print(args)    # Imprime argumentos adicionales sin palabras clave
    print(kwargs)  # Imprime argumentos con palabras clave

function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}
Aquí, 1 y 2 son argumentos estándar que corresponden a a y b en la definición de la función. La tupla (3, 4, 5) representa argumentos adicionales que se agrupan en args. Los argumentos nombrados restantes se agrupan en kwargs como un diccionario.
Al usar *args y **kwargs con argumentos estándar, asegúrate de no olvidar los argumentos estándar al llamar a la función, ya que esto generaría un TypeError. Por ejemplo, llamar a function_example(1, Name='Alice', Age=25) sin proporcionar un valor para el argumento b resultaría en un error.
 
To check your solution you need to sign in
Sign in to continue