Argumentos posicionales arbitrarios

En este tercer método estamos considerando argumentos posicionales pero, en la definición de la función, no especificamos exactamente cuántos argumentos esperamos. En su lugar, incluimos un único parámetro que va a recibir todos los argumentos que se pasen en la invocación de la función:

def suma(*args):
    pass

 

suma(2, 3, 5)

En el código anterior estamos invocando la función con tres argumentos (2, 3 y 5) pero la cabecera de nuestra función no incluye tres parámetros, sino solo uno precedido por un asterisco. El nombre de este parámetro podría ser cualquiera pero, por convenio, se utiliza el nombre args. Esta variable es, de hecho, una tupla que va a contener todos los argumentos recibidos, cosa que podemos ver con el siguiente código:

def suma(*args):
    print(type(args))
    print(args)

 

suma(2, 3, 5)

<class 'tuple'>
(2, 3, 5)

Comprobamos que, en primer lugar, para hacer referencia a dicha variable tenemos que usar su nombre sin el asterisco ("args"). Y, efectivamente, vemos que se trata de una tupla que contiene los argumentos de nuestra invocación.

Si queremos realizar alguna operación con estos argumentos, no tenemos más que operar con los valores de la tupla. Por ejemplo, nuestra función suma devolvería la suma de los argumentos recibidos con el siguiente código:

def suma(*args):
    total = 0
    for n in args:
        total += n
    return total

 

suma(2, 3, 5)

10

Estos argumentos posicionales arbitrarios siempre deberán aparecer a la derecha de los argumentos posicionales. Así, el siguiente código devolvería un error:

def suma(*args, c):
    total = 0
    for n in args:
        total += n
    return total

 

suma(2, 3, 5)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-548e86a1d527> in <module>
      5     return total
      6 
----> 7 suma(2, 3, 5)

TypeError: suma() missing 1 required keyword-only argument: 'c'