*args & **kwargs
*args et **kwargs acceptent un nombre variable d'arguments, et les marqueurs / et * imposent un passage positionnel ou nommé. Ils permettent des fonctions souples au contrat clair.
- variadique
- arguments
- déballage
- positionnel
- nommé
- keyword-only
Syntaxe
def f(a, b, /, c, *, d, **kwargs): ...# │ │ │ │ └ arguments nommés en surplus (dict)# │ │ │ └ d : nommé seulement# │ │ └ après * : tout est nommé# │ └ c : positionnel ou nommé# └ a, b : positionnels seulement (avant /)def g(*args, **kwargs): ...g(*liste, **dico) # déballage à l'appelExemple
def total(*montants, remise=0): return round(sum(montants) * (1 - remise), 2)print(total(10, 20, 30)) # → 60print(total(10, 20, 30, remise=0.1)) # → 54.0paniers = [5.5, 4.5]print(total(*paniers)) # → 10.0def rapport(titre, /, *, format="texte", **options): return f"{titre} ({format}) {options}"print(rapport("Ventes", format="csv", sep=";")) # → Ventes (csv) {'sep': ';'}À retenir
- *args reçoit les arguments positionnels en surplus sous forme de tuple, **kwargs les arguments nommés en surplus sous forme de dictionnaire. Les noms args et kwargs ne sont qu'une convention.
- Tout paramètre placé après * ou après *args se passe obligatoirement par son nom : total(10, 20, remise=0.1). Un taux ne risque plus d'être pris pour un montant.
- Les paramètres placés avant / sont positionnels seulement (3.8+) : rapport(titre="Ventes") lève TypeError, ce qui laisse libre de renommer titre plus tard.
- L'ordre est imposé dans la signature : positionnels seuls, /, paramètres ordinaires, *args ou *, nommés seuls, **kwargs.
- Piège : **kwargs avale les fautes de frappe. rapport("Ventes", fromat="csv") ne lève aucune erreur et l'option est ignorée ; préférez des paramètres nommés explicites quand la liste des options est connue.
Voir aussi
- def — Définir une fonctiondef regroupe un traitement sous un nom, avec des paramètres en entrée et return en sortie. Écrivez une fonction dès qu'un calcul sert deux fois ou mérite d'être vérifié à part.
- Annotations de typeLes annotations de type documentent ce qu'une fonction attend et renvoie (list[int], str | None). Python ne les vérifie pas à l'exécution, mais l'éditeur et mypy s'en servent pour repérer les erreurs.