arguments *args et **kwargs dans les fonctions

24 Apr 2019 24 Apr 2019 13082 vues ESSADDOUKI Mostafa 6 min de lecture

Arguments variables — *args et **kwargs

Lors de la définition d'une fonction, il est parfois impossible de connaître à l'avance le nombre exact d'arguments qui seront passés. Python propose deux mécanismes élégants pour gérer ce cas : *args pour les arguments positionnels variables, et **kwargs pour les arguments nommés variables.


*args**kwargs
Type d'argumentsPositionnels (sans nom)Nommés (clé = valeur)
Structure internetupledict
Accès aux élémentsPar indice : args[0]Par clé : kwargs['cle']
Itérable✅ Oui✅ Oui (.items())
Ordre garanti✅ Oui✅ Oui (Python ≥ 3.7)

*args — Arguments positionnels variables

Définition *args permet à une fonction de recevoir un nombre quelconque d'arguments positionnels (sans nom). Ces arguments sont regroupés automatiquement dans un tuple accessible via la variable args.
Convention de nommage Le symbole * est obligatoire, mais le nom args est une convention, pas une obligation. On pourrait écrire *nombres, *valeurs, etc. Le nom doit être explicite selon le contexte.
Syntaxe
def fonction(*args):
    # args est un tuple contenant tous les arguments reçus
    for arg in args:
        print(arg)

Exemple — Afficher des valeurs de types variés

def afficher(*args):
    for elm in args:
        print(elm)

afficher(2, 'Mostafa', 'Meknes', 12.3, [1, 3])
Sortie
2
Mostafa
Meknes
12.3
[1, 3]

Exemple — Mélange d'un paramètre fixe et de *args

Il est possible de combiner des paramètres normaux avec *args. Les paramètres normaux doivent toujours être déclarés avant *args.

def info(nom, *args):
    print("Nom         :", nom)
    print("Prénom      :", args[0])
    print("Ville       :", args[1])
    print("Âge         :", args[2])
    print("Inscription :", args[3])

info('ESSADDOUKI', 'Mostafa', 'Meknès', 31, 2019)
Sortie
Nom         : ESSADDOUKI
Prénom      : Mostafa
Ville       : Meknès
Âge         : 31
Inscription : 2019

Exemple — Multiplication de n nombres

def multiplier(*args):
    produit = 1
    for val in args:
        produit *= val
    return produit

print(multiplier(2, 3))           # 6
print(multiplier(2, 3, 4))        # 24
print(multiplier(1, 2, 3, 4, 5))  # 120
Sortie
6
24
120
Astuce — Déballage avec * L'opérateur * peut aussi être utilisé à l'appelpour déballer une liste ou un tuple en arguments positionnels :
valeurs = [2, 3, 4]
print(multiplier(*valeurs))   # équivalent à multiplier(2, 3, 4) → 24

**kwargs — Arguments nommés variables

Définition **kwargs permet à une fonction de recevoir un nombre quelconque d'arguments nommés (clé = valeur). Ces arguments sont regroupés automatiquement dans un dictionnaire accessible via la variable kwargs.
Remarque — Ordre en Python ≥ 3.7 Depuis Python 3.7, les dictionnaires conservent l'ordre d'insertion. Ainsi kwargs reflète l'ordre dans lequel les arguments nommés ont été passés à la fonction.
Syntaxe
def fonction(**kwargs):
    # kwargs est un dict  { 'cle': valeur, ... }
    for cle, valeur in kwargs.items():
        print(f"{cle} : {valeur}")

Exemple — Fiche d'information avec **kwargs

def info(**kwargs):
    print("Nom         :", kwargs['nom'])
    print("Prénom      :", kwargs['prenom'])
    print("Ville       :", kwargs['ville'])
    print("Âge         :", kwargs['age'])
    print("Inscription :", kwargs['annee'])

info(nom='ESSADDOUKI', prenom='Mostafa', ville='Meknès', age=31, annee=2019)
Sortie
Nom         : ESSADDOUKI
Prénom      : Mostafa
Ville       : Meknès
Âge         : 31
Inscription : 2019

Exemple — Parcourir tous les arguments nommés

def afficher_infos(**kwargs):
    print("=== Informations reçues ===")
    for cle, valeur in kwargs.items():
        print(f"  {cle:15} → {valeur}")

afficher_infos(langue="Python", version=3.12, auteur="Guido", annee=1991)
Sortie
=== Informations reçues ===
  langue          → Python
  version         → 3.12
  auteur          → Guido
  annee           → 1991
Astuce — Déballage avec ** L'opérateur **peut aussi déballer un dictionnaire lors de l'appel :
donnees = {"nom": "ESSADDOUKI", "prenom": "Mostafa", "ville": "Meknès", "age": 31, "annee": 2019}
info(**donnees)   # équivalent à info(nom="ESSADDOUKI", prenom="Mostafa", ...)

Combiner *args et **kwargs

Il est possible d'utiliser *args et **kwargs simultanément dans la même fonction. L'ordre de déclaration des paramètres doit obligatoirement respecter la règle suivante :

Ordre obligatoire des paramètres
  1. Paramètres positionnels normaux (ex. nom)
  2. *args — arguments positionnels variables
  3. Paramètres nommés normaux avec valeur par défaut
  4. **kwargs — arguments nommés variables
Syntaxe complète
def fonction(param1, param2, *args, cle=defaut, **kwargs):
    ...

Exemple — *args et **kwargs combinés

def info(*args, **kwargs):
    print("Nom         :", args[0])
    print("Prénom      :", args[1])
    print("Ville       :", kwargs['ville'])
    print("Âge         :", kwargs['age'])
    print("Inscription :", kwargs['annee'])

info('ESSADDOUKI', 'Mostafa', ville='Meknès', age=31, annee=2019)
Sortie
Nom         : ESSADDOUKI
Prénom      : Mostafa
Ville       : Meknès
Âge         : 31
Inscription : 2019

Exemple — Fonction générique de log

Un exemple plus réaliste : une fonction qui affiche un message avec des métadonnées optionnelles.

def log(niveau, *messages, **meta):
    print(f"[{niveau.upper()}]", " | ".join(str(m) for m in messages))
    if meta:
        for cle, val in meta.items():
            print(f"  {cle}: {val}")

log("info", "Démarrage du serveur")
log("erreur", "Fichier introuvable", "Vérifiez le chemin",
    fichier="data.csv", ligne=42)
Sortie
[INFO] Démarrage du serveur
[ERREUR] Fichier introuvable | Vérifiez le chemin
  fichier: data.csv
  ligne: 42

Récapitulatif

SyntaxeNom usuelType PythonAccèsAppel
def f(a, b)Paramètres normauxa, bf(1, 2)
def f(*args)Args positionnels variablestupleargs[i]f(1, 2, 3, ...)
def f(**kwargs)Args nommés variablesdictkwargs['cle']f(x=1, y=2, ...)
def f(*args, **kwargs)Combinaison complètetuple + dictLes deuxf(1, 2, x=3, y=4)
Erreur fréquente — Ordre des arguments à l'appel Lors de l'appel d'une fonction combinant *args et **kwargs, les arguments positionnels doivent toujours être passés avant les arguments nommés:
# ✅ Correct
info('ESSADDOUKI', 'Mostafa', ville='Meknès', age=31)

# ❌ Erreur SyntaxError
info(ville='Meknès', 'ESSADDOUKI', 'Mostafa', age=31)

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.