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'arguments | Positionnels (sans nom) | Nommés (clé = valeur) |
| Structure interne | tuple | dict |
| Accès aux éléments | Par indice : args[0] | Par clé : kwargs['cle'] |
| Itérable | ✅ Oui | ✅ Oui (.items()) |
| Ordre garanti | ✅ Oui | ✅ Oui (Python ≥ 3.7) |
*args — Arguments positionnels variables
*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.* 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.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])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)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)) # 1206 24 120
* 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
**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.kwargs reflète l'ordre dans lequel les arguments nommés ont été passés à la fonction.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)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)=== Informations reçues === langue → Python version → 3.12 auteur → Guido annee → 1991
** 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 :
- Paramètres positionnels normaux (ex.
nom) *args— arguments positionnels variables- Paramètres nommés normaux avec valeur par défaut
**kwargs— arguments nommés variables
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)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)[INFO] Démarrage du serveur [ERREUR] Fichier introuvable | Vérifiez le chemin fichier: data.csv ligne: 42
Récapitulatif
| Syntaxe | Nom usuel | Type Python | Accès | Appel |
|---|---|---|---|---|
def f(a, b) | Paramètres normaux | — | a, b | f(1, 2) |
def f(*args) | Args positionnels variables | tuple | args[i] | f(1, 2, 3, ...) |
def f(**kwargs) | Args nommés variables | dict | kwargs['cle'] | f(x=1, y=2, ...) |
def f(*args, **kwargs) | Combinaison complète | tuple + dict | Les deux | f(1, 2, x=3, y=4) |
*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.