Pasar cantidades arbitrarias de argumentos#

Debido a que los parámetros en Python se comportan de manera similar a un tuple, podemos pasar una cantidad arbitraria de argumentos para una función. Para hacer esto, debemos agregar un asterisco (*) antes del nombre del parámetro. Por ejemplo, podemos tener una función que nos pida cuáles libros nuevos hemos comprado:

def libros_nuevos(*libros):
    """Imprime los libros nuevos que se han comprado.
    
    Parámetros
    ----------
    libros: tuple
        Lista de libros nuevos que se han comprado
    """
    print("Los libros nuevos que se han comprado son:")
    for libro in libros:
        print(f"- {libro}")

Ahora podemos llamar a la función libros_nuevos() con una cantidad arbitraria de argumentos:

libros_nuevos("El principito", "El señor de los anillos", "El quijote", "Ser y tiempo", "El aleph", "Vigilar y castigar", "Elogio de la locura")
Los libros nuevos que se han comprado son:
- El principito
- El señor de los anillos
- El quijote
- Ser y tiempo
- El aleph
- Vigilar y castigar
- Elogio de la locura

En este caso, no importa si compramos un libro o 100 libros, la función libros_nuevos() imprimirá todos los libros que se han comprado.

Mezclar argumentos posicionales y arbitrarios#

Ahora, podemos modificar esta función para que reciba un argumento posicional y un argumento arbitrario. Por ejemplo, si queremos agregar el nombre de la persona que compró los libros, podemos hacer lo siguiente:

def libros_nuevos(nombre, *libros):
    """Imprime los libros nuevos que se han comprado.
    
    Parámetros
    ----------
    nombre: str
        Nombre de la persona que compró los libros
    libros: tuple
        Lista de libros nuevos que se han comprado
    """
    print(f"Hola {nombre}. Has comprado los siguientes libros:")
    for libro in libros:
        print(f"- {libro}")

Ahora podemos llamar a la función libros_nuevos() con un argumento posicional y una cantidad arbitraria de argumentos:

usuario = "Juan"
libros_nuevos(usuario, "El principito", "El señor de los anillos", "El quijote", "Ser y tiempo", "El aleph", "Vigilar y castigar", "Elogio de la locura")
Hola Juan. Has comprado los siguientes libros:
- El principito
- El señor de los anillos
- El quijote
- Ser y tiempo
- El aleph
- Vigilar y castigar
- Elogio de la locura

Observación

El argumento arbitrario es de tipo tuple, no listado. Si pasamos como argumento una lista la función no iterará sobre cada elemento, para ello debemos desempaquetar la lista con el operador *.

Por ejemplo:

usuario = “Juan” listado_libros = [“El señor de los anillos”, “El principito”, “El quijote”]

libros_nuevos(usuario, *listado_libros)

Pasar cantidades arbitrarias de argumentos con palabras clave#

Debido a que los parámetros en Python se comportan de manera similar a un diccionario, podemos pasar una cantidad arbitraria de argumentos con palabras clave para una función. Para hacer esto, debemos agregar dos asteriscos (**) antes del nombre del parámetro. Por ejemplo, podemos tener una función que nos pida cuáles libros nuevos hemos comprado:

def libros_nuevos(**libros):
    """Imprime los libros nuevos que se han comprado.
    
    Parámetros
    ----------
    libros: dict
        Diccionario con los libros nuevos que se han comprado
    """
    print("Los libros nuevos que se han comprado son:")
    for libro, autor in libros.items():
        print(f"- {libro} ({autor})")

Ahora podemos llamar a la función libros_nuevos() con una cantidad arbitraria de argumentos con palabras clave:

libros_nuevos(
    El_principito="Antoine de Saint-Exupéry",
    El_señor_de_los_anillos="J. R. R. Tolkien",
    El_quijote="Miguel de Cervantes",
    Ser_y_tiempo="Martin Heidegger",
    El_aleph="Jorge Luis Borges",
    Vigilar_y_castigar="Michel Foucault",
    Elogio_de_la_locura="Erasmo de Rotterdam",
)
Los libros nuevos que se han comprado son:
- El_principito (Antoine de Saint-Exupéry)
- El_señor_de_los_anillos (J. R. R. Tolkien)
- El_quijote (Miguel de Cervantes)
- Ser_y_tiempo (Martin Heidegger)
- El_aleph (Jorge Luis Borges)
- Vigilar_y_castigar (Michel Foucault)
- Elogio_de_la_locura (Erasmo de Rotterdam)

Podemos, de la misma manera, pasar argumentos posicionales y argumentos con palabras clave a la función libros_nuevos():

def libros_nuevos(autor, titulo, **atributos):
    atributos["autor"] = autor
    atributos["titulo"] = titulo
    return atributos
libros_nuevos(
    "Antoine de Saint-Exupéry",
    "El principito",
    editorial="Salamandra",
    año=1943,
    genero="Ciencia ficción",
    idioma="Francés",
)
{'editorial': 'Salamandra',
 'año': 1943,
 'genero': 'Ciencia ficción',
 'idioma': 'Francés',
 'autor': 'Antoine de Saint-Exupéry',
 'titulo': 'El principito'}

En general, el uso de argumentos arbitrarios es útil cuando no sabemos cuántos argumentos se pasarán a una función. No es algo que utilicemos a menudo, pero es ampliamente usado en librerías de terceros, por eso es importante conocerlo y aprender a utilizarlo.