Comment utiliser les kwargs en Python ?

Le paramètre kwargs permet de créer une fonction qui accepte un nombre indéfini d'arguments nommés.

Dans la définition d'une fonction, il doit être précédé d'un double opérateur 'splat' (**) :

def foo(**kwargs):
    print(kwargs)

La fonction foo accepte ainsi 0, 1 ou un nombre infini d'arguments nommés, par exemple :

def foo(**kwargs):
    print(kwargs)

foo()
foo(a=1)
foo(a=1, mot='Bonjour', boolean=True)

À l'intérieur de la fonction, les arguments envoyés au paramètre kwargs seront récupérés sous la forme d'un dictionnaire :

def foo(**kwargs):
    print(kwargs)
    print(isinstance(kwargs, dict))

foo(a=1, b=2, c=3)

Il est important de noter que le nom de kwargs n'est qu'une convention. On pourrait utiliser n'importe quel nom et cela fonctionnerait de la même façon.

👉 La seule chose qui compte vraiment, c'est le double opérateur splat qui précède le nom du paramètre :

def foo(**nombres):
    print(nombres)

Exemples

Créer un utilisateur avec différents attributs

class User:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

utilisateur = User(prenom="Patrick", nom="Smith", age=30)
print(utilisateur.prenom, utilisateur.nom, utilisateur.age)

utilisateur2 = User(prenom="Luigi", age=25, nationalite="Italien")
print(utilisateur2.prenom, utilisateur2.age, utilisateur2.nationalite)

☝️ ici on utilise **kwargsdans la méthode __init__ d'une classe (pour définir les attributs on utilise la fonction setattr).

Additionner deux nombres

def add(**kwargs):
    """Fonction qui permet d'additionner deux nombres"""
    if len(kwargs.items()) != 2:
        return "Vous ne pouvez additionner que deux nombres."

    result = sum(kwargs.values())

    first_number, second_number = list(kwargs)[0], list(kwargs)[1]
    return "L'addition de {} avec {} est égale à {}.".format(first_number, second_number, result)


print(add(x=4, y=10))
print(add(a=2, b=5))
print(add(patrick=25, john=30))
print(add(a=2, b=5, c=4))

☝️ ici on utilise **kwargs pour ajouter deux nombres ensemble.

L'avantage, c'est que nous pouvons nommer les paramètres comme bon nous semble.

Plutôt que de forcer l'utilisation de a et b, nous pouvons nommer les paramètres x et y ou nombre1 et nombre2 par exemple.