🐍 PyTutos

*args et **kwargs : fonctions à arguments variables

Crée des fonctions qui acceptent un nombre indéfini d'arguments.

⏱ 10 minutes 📂 intermediaire #intermediaire #fonctions #args #kwargs

*args et **kwargs

Comment faire une fonction qui accepte autant d'arguments qu'on veut ? Avec *args (positionnels) et **kwargs (nommés).

*args — arguments positionnels variables

def total(*args):
    print(args)            # tuple
    print(sum(args))

total(1, 2, 3)             # (1, 2, 3) puis 6
total(10, 20, 30, 40)      # (10, 20, 30, 40) puis 100
total()                    # () puis 0

Le nom args est une convention — tu peux écrire *nombres si c'est plus parlant.

**kwargs — arguments nommés variables

def affiche_infos(**kwargs):
    for cle, valeur in kwargs.items():
        print(f"{cle} : {valeur}")

affiche_infos(nom="Zazac", age=10, ville="Bordeaux")
# nom : Zazac
# age : 10
# ville : Bordeaux

Tout combiner

L'ordre est imposé : params normaux, *args, **kwargs.

def fonction(obligatoire, *args, **kwargs):
    print("Obligatoire :", obligatoire)
    print("Args        :", args)
    print("Kwargs      :", kwargs)

fonction("Salut", 1, 2, 3, couleur="rouge", taille=42)
# Obligatoire : Salut
# Args        : (1, 2, 3)
# Kwargs      : {'couleur': 'rouge', 'taille': 42}

Déballer (unpacking) à l'appel

À l'inverse, on peut étaler une liste/dico dans un appel :

def addition(a, b, c):
    return a + b + c

valeurs = [1, 2, 3]
print(addition(*valeurs))    # 6 — équivalent de addition(1, 2, 3)

params = {"a": 1, "b": 2, "c": 3}
print(addition(**params))    # 6

Cas pratique : passer des arguments à une autre fonction

def log_et_appel(fonction, *args, **kwargs):
    print(f"J'appelle {fonction.__name__}({args}, {kwargs})")
    return fonction(*args, **kwargs)

def hello(nom, ponctuation="!"):
    return f"Hello {nom}{ponctuation}"

print(log_et_appel(hello, "Zazac", ponctuation="?"))

💡 *args et **kwargs sont la base des décorateurs et de plein de patterns avancés. Tu en verras partout dans le code Python !

🧪 Quiz de validation

Réponds à toutes les questions. Il faut 70% de bonnes réponses pour valider le tuto !

🔒 Tu dois être connecté pour passer le quiz.