Compartir en Twitter
Go to Homepage

CÓMO UTILIZAR *ARGS Y **KWARGS EN PYTHON: CONSEJOS PRÁCTICOS

August 12, 2025

Utilizar *args y **kwargs en Python para manejar argumentos variables de forma dinámica

En el desarrollo con Python, es fundamental saber cómo manejar múltiples argumentos de diferentes tipos y cantidades para crear funciones versátiles y adaptables. Las herramientas *args y **kwargs son esenciales para lograr este objetivo, permitiendo que las funciones acepten un número variable de argumentos sin necesidad de definirlos explícitamente.

La función *args recoge los argumentos posicionales en una tupla, facilitando el manejo de una cantidad indefinida de parámetros. Por ejemplo, para sumar cualquier cantidad de números, podemos definir:

def sumar_numeros(*args):
    total = 0
    for numero in args:
        total += numero
    return total

resultado = sumar_numeros(5, 10, 20, 30)  # 65

Este enfoque permite enviar cualquier cantidad de números como argumentos y obtener la suma sin importar la cantidad.

Por otro lado, **kwargs recoge los argumentos nombrados en un diccionario, lo que permite pasar información adicional en forma de clave-valor sin modificar la definición de la función. Un ejemplo práctico es:

def crear_persona(nombre, edad, **kwargs):
    persona = {'nombre': nombre, 'edad': edad}
    for clave, valor in kwargs.items():
        persona[clave] = valor
    return persona

persona = crear_persona('Eduardo', 27, ciudad='Lima', profesion='Ingeniero')
# {'nombre': 'Eduardo', 'edad': 27, 'ciudad': 'Lima', 'profesion': 'Ingeniero'}

Así, **kwargs permite agregar argumentos adicionales de manera dinámica, facilitando la extensión de funciones sin necesidad de cambios estructurales.

Dominar *args y **kwargs es clave para escribir código Python más limpio y efectivo, ya que permiten manejar argumentos de manera dinámica y flexible.

Pasar argumentos posicionales con *args para funciones más limpias y flexibles

En muchas ocasiones, no sabemos cuántos argumentos posicionales serán necesarios en una función. Aquí es donde *args se convierte en una herramienta indispensable, ya que permite recibir un número variable de argumentos posicionales sin definirlos explícitamente.

Al definir una función con *args, podemos recibir todos los argumentos posicionales en una tupla, lo que facilita su manejo interno. Por ejemplo:

def imprimir_elementos(*args):
    for elemento in args:
        print(elemento)

imprimir_elementos("Hola", "Mundo", 2022)

La salida será:

Hola
Mundo
2022

Además, el nombre del parámetro puede ser personalizado, aunque por convención se usa args. Esta flexibilidad permite adaptar el código al contexto específico.

Utilizar *args es una técnica poderosa para evitar funciones con listas extensas de parámetros, haciendo el código más legible y adaptable.

Manejar argumentos nombrados con **kwargs para mayor versatilidad en funciones

La función **kwargs permite recibir argumentos nombrados adicionales en forma de un diccionario, lo que es especialmente útil cuando queremos que una función acepte parámetros opcionales o variables.

Por ejemplo, una función que recibe datos de un empleado puede definirse así:

def agrega_empleado(nombre, apellido, edad, **kwargs):
    print("Nombre:", nombre)
    print("Apellido:", apellido)
    print("Edad:", edad)
    for clave, valor in kwargs.items():
        print(f"{clave} : {valor}")

agrega_empleado("Juan", "Pérez", 35, cargo="Gerente", salario=100000)

La salida será:

Nombre: Juan
Apellido: Pérez
Edad: 35
cargo : Gerente
salario : 100000

Esto permite pasar argumentos de palabra clave de manera dinámica y accesible desde cualquier contexto, facilitando la escalabilidad de las funciones.

La capacidad de **kwargs para manejar argumentos adicionales sin modificar la función es una ventaja clave para el desarrollo de código flexible y mantenible.

Combinar *args y **kwargs para funciones versátiles y escalables

La combinación de *args y **kwargs en una misma función permite aceptar tanto argumentos posicionales como nombrados, haciendo que las funciones sean altamente adaptables.

Un ejemplo básico de esta combinación es:

def funcion_combinada(*args, **kwargs):
    for arg in args:
        print(arg)
    for clave, valor in kwargs.items():
        print(f"{clave} {valor}")

funcion_combinada(1, 2, 3, nombre="Juan", edad=25)

Salida:

1
2
3
nombre Juan
edad 25

Un caso más avanzado es una función que calcula el valor futuro de una inversión, permitiendo parámetros adicionales para modificar el cálculo:

def valor_futuro(monto, tasa, tiempo, *args, **kwargs):
    interes_compuesto = kwargs.get('interes_compuesto', False)
    if interes_compuesto:
        monto *= (1 + tasa) ** tiempo
    else:
        monto *= 1 + (tasa * tiempo)
    return monto

print(valor_futuro(1000, 0.05, 10))  # 1500.0
print(valor_futuro(1000, 0.05, 10, interes_compuesto=True))  # 1628.894626777442

Esta técnica permite crear funciones más versátiles y escalables, capaces de adaptarse a múltiples escenarios sin necesidad de redefinir su estructura.

Documentar funciones con *args y **kwargs para facilitar su comprensión y mantenimiento

La documentación clara y precisa es fundamental para que otros desarrolladores comprendan el uso y propósito de las funciones que utilizan *args y **kwargs.

El uso de docstrings permite describir la función, sus parámetros y valores de retorno. Por ejemplo:

def sumar_numeros(*args):
    """
    Suma cualquier cantidad de números y retorna el total.

    :param args: Números a sumar.
    :return: Suma total de los números.
    """
    total = 0
    for numero in args:
        total += numero
    return total

Además, especificar los argumentos y usar anotaciones de tipos mejora la claridad:

def multiplicar_numeros(*args: int, factor: int = 1) -> list[int]:
    """
    Multiplica una lista de números por un factor.

    :param args: Números a multiplicar.
    :param factor: Factor multiplicador (por defecto 1).
    :return: Lista de números multiplicados.
    """
    return [numero * factor for numero in args]

Esta práctica facilita el trabajo en equipo y el mantenimiento del código, asegurando que las funciones sean entendidas y utilizadas correctamente.

Conclusiones

El dominio de *args y **kwargs en Python es esencial para escribir funciones flexibles, limpias y escalables. Estas herramientas permiten manejar argumentos variables de forma dinámica, adaptándose a diferentes necesidades sin modificar la estructura de las funciones.

Al combinar ambas técnicas, se pueden crear funciones que aceptan tanto argumentos posicionales como nombrados, aumentando su versatilidad. Además, la documentación adecuada mediante docstrings y anotaciones de tipos es clave para facilitar la comprensión y mantenimiento del código.

Incorporar estas prácticas en el desarrollo diario mejora la calidad del código y potencia la productividad, convirtiéndose en habilidades indispensables para cualquier programador Python.