Aller au contenu
Fonctions

*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

Modèle
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'appel

Exemple

Exemple concret
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

  1. *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.
  2. 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.
  3. 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.
  4. L'ordre est imposé dans la signature : positionnels seuls, /, paramètres ordinaires, *args ou *, nommés seuls, **kwargs.
  5. 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