*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="?"))
💡
*argset**kwargssont 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.