Por último, en este enfoque pasamos a la función un cierto número de argumentos clave sin que la función sepa cuántos va a recibir -tal y como ocurría con los argumentos posicionales arbitrarios-. Al igual que entonces, es un único parámetro el que recibe todos los argumentos que, en este caso, están compuestos por un nombre y un valor:
def suma(**kwargs):
pass
suma(a = 1, b = 3, c = 2)
Vemos cuál es la sintaxis: en la cabecera de la función usamos dos asteriscos seguidos por el nombre de una variable que, por convenio, es kwargs (podría ser otra). Esta variable es un diccionario que contiene los nombres de los parámetros y sus valores:
def suma(**kwargs):
print(type(kwargs))
for key, value in kwargs.items():
print("Clave:", key, "Valor:", value)
suma(a = 1, b = 3, c = 2)
<class 'dict'>
Clave: a Valor: 1
Clave: b Valor: 3
Clave: c Valor: 2
Una vez más, si queremos operar con las claves o los valores contenidos en este diccionario podemos hacerlo sin mayor problema. En nuestro ejemplo queremos devolver la suma de los valores (ignorando los nombres recibidos como clave), cosa que podríamos hacer con el siguiente código:
def suma(**kwargs):
total = 0
for value in kwargs.values():
total += value
return total
suma(a = 1, b = 3, c = 2)
6
Estos argumentos clave arbitrarios deberán siempre aparecer a la derecha de los argumentos clave. Por ejemplo, el siguiente código devolvería un error:
def suma(**kwargs, c):
total = 0
for value in kwargs.values():
total += value
return total
suma(a = 1, b = 3, c = 2)
File "<ipython-input-18-afc87d5a54a8>", line 1
def suma(**kwargs, c):
^
SyntaxError: invalid syntax