La flexibilité dans la définition des fonctions est une caractéristique primordiale en programmation Python, particulièrement lorsqu’il s’agit de gérer des paramètres dont le nombre ou la nature peut varier. Pour répondre à ce besoin, Python propose des mécanismes puissants tels que *args, **kwargs et les valeurs par défaut. Ces outils permettent d’élaborer des fonctions polyvalentes capables d’accepter aussi bien un nombre variable d’arguments positionnels que des arguments nommés facultatifs. En 2025, maîtriser ces concepts est incontournable pour tout développeur souhaitant écrire un code modulable, clair et maintenable dans un environnement où la robustesse et l’adaptabilité sont des exigences standards.
Ce système d’arguments optionnels facilite la création de fonctions dont la signature ne limite pas l’appel à un nombre fixe d’arguments, offrant ainsi une flexibilité des fonctions indispensable dans des projets complexes ou évolutifs. Qu’il s’agisse d’interfaces de programmation applicatives, de scripts d’automatisation ou d’analyse de données, ces techniques améliorent considérablement la qualité et la réutilisabilité du code.
Dans cet article, une attention particulière est portée à l’utilisation méthodique de ces fonctionnalités, avec des exemples représentatifs et des conseils pour intégrer arguments variables, arguments nommés et valeurs par défaut au sein de fonctions Python, que ce soit au niveau de la définition ou lors de leur appel.
En bref, comprendre et utiliser *args, **kwargs et les paramètres optionnels permet de concevoir des fonctions adaptables, capables de traiter des cas d’usage divers sans redondance ni complexité superflue :
- *args collecte les arguments positionnels supplémentaires sous forme de tuple.
- **kwargs recueille les arguments nommés dans un dictionnaire.
- Les valeurs par défaut simplifient la gestion des paramètres optionnels.
- Toutes ces techniques contribuent à une meilleure lisibilité et modularité du code.
- L’utilisation combinée optimise la signature de fonction pour une fonction polyvalente.
Utiliser *args pour gérer les arguments positionnels variables en Python
Le préfixe * devant un paramètre dans une fonction Python indique que celle-ci accepte un nombre indéfini d’arguments positionnels, lesquels sont ensuite regroupés dans un tuple accessible depuis le corps de la fonction. Par exemple, définir une fonction de somme avec *args permet de traiter dynamiquement tout nombre d’entiers sans imposer de limite prédéfinie :
def somme_dynamic(*args):
return sum(args)
Dans cet exemple, l’appel somme_dynamic(4, 7, 1, 8) retourne 20. Ce mécanisme s’avère particulièrement puissant pour des fonctions où les arguments exacts ne sont pas connus à l’avance. *args conserve l’ordre des arguments transmis, ce qui est pertinent lorsque la position des paramètres importe.
Il est important de noter qu’il est possible de combiner *args avec des paramètres positionnels fixes, les arguments supplémentaires étant alors réunis dans le tuple. Si aucun argument supplémentaire n’est fourni, *args correspond à un tuple vide, garantissant la robustesse du code.
En revanche, si des paramètres suivent *args dans la définition, ceux-ci doivent impérativement être spécifiés lors de l’appel sous forme d’arguments nommés. Cette restriction permet de mieux contrôler la signature de fonction, en séparant clairement arguments variables et paramètres obligatoires nommés.

Exemple d’implémentation pratique avec *args
Un cas d’usage fréquent consiste à créer une fonction flexible qui additionne plusieurs valeurs, tout en autorisant un paramètre supplémentaire obligatoire :
def calcul_personnalise(fixe1, *args, fixe2):
total = sum(args) + fixe1 + fixe2
return total
Cette fonction requiert deux arguments fixes encadrant des arguments positionnels variables. La gestion de la signature impose de transmettre fixe2 exclusivement par mot-clé lors de l’appel, comme dans calcul_personnalise(1, 2, 3, fixe2=4).
**kwargs : collecter les arguments nommés dans un dictionnaire pour plus de souplesse
En appliquant le double astérisque ** devant un paramètre dans la définition d’une fonction, Python offre la possibilité de recueillir tous les arguments passés en mots-clés supplémentaires dans un dictionnaire. Ce dictionnaire contient comme clés le nom des arguments et comme valeurs les valeurs associées, ce qui facilite la manipulation d’une grande diversité de paramètres optionnels.
Par exemple :
def afficher_informations(**kwargs):
for nom, valeur in kwargs.items():
print(f"{nom} = {valeur}")
L’appel afficher_informations(age=36, ville="Paris", profession="développeur") affiche chaque paire clé-valeur, sans que la fonction n’ait eu besoin d’anticiper les noms des paramètres. Cette technique augmente la flexibilité des fonctions sur des cas d’usage variables et personnalisés.
Pour approfondir la manipulation des arguments et retours en Python.
Combiner **kwargs avec des arguments positionnels
Les arguments variables par mots-clés ne sont pas exclusifs aux seuls kwargs. Ils s’intègrent aisément avec d’autres paramètres positionnels classiques, offrant une profondeur supplémentaire à la signature des fonctions :
def fonction_mixte(arg1, arg2, **kwargs):
print("Arg1:", arg1)
print("Arg2:", arg2)
print("Arguments nommés :", kwargs)
L’appel fonction_mixte(10, 20, option="valeur", verbose=True) illustre comment les différents types d’arguments cohabitent harmonieusement.

Les valeurs par défaut dans les signatures Python : simplifier les arguments optionnels
Un autre levier puissant pour améliorer la souplesse des fonctions réside dans l’usage des valeurs par défaut. Ces valeurs permises dans la déclaration des paramètres garantissent que l’argument est facultatif : si le paramètre n’est pas explicitement spécifié lors de l’appel, le paramètre prendra automatiquement la valeur par défaut.
Exemple classique :
def saluer(nom="Invité"):
print(f"Bonjour, {nom}!")
Dans cet exemple, l’appel sans argument, saluer(), affiche « Bonjour, Invité! » tandis que saluer("Alice") intègre la valeur personalisée.
Installer des valeurs par défaut participe à la conception de fonctions claire et ergonomique, évitant la surcharge d’arguments tout en offrant des comportements prédictibles et cohérents.
Interaction des valeurs par défaut avec *args et **kwargs
Ces mécanismes sont naturellement compatibles. Par exemple, dans une fonction qui recueille des arguments positionnels via *args et des paramètres optionnels via valeurs par défaut, les paramètres fixes avec valeurs par défaut peuvent être placés avant ou après *args selon le contexte :
def exemple_mixte(a, *args, option=True):
print("a:", a)
print("args:", args)
print("option:", option)
L’appel exemple_mixte(1, 2, 3, option=False) démontre la combinaison harmonieuse de paramètres, arguments variables et réglages facultatifs.

Quelle est la différence principale entre *args et kwargs ?
*args collecte les arguments positionnels dans un tuple, tandis que kwargs capture les arguments nommés sous forme de dictionnaire. Ces deux mécanismes permettent d’accepter un nombre variable d’arguments dans une fonction.
Peut-on imposer qu’un argument soit uniquement nommé dans une fonction Python ?
Oui, en plaçant un seul * dans la signature, les arguments qui suivent doivent être passés par mot-clé uniquement, même sans valeurs par défaut.
Comment utiliser les valeurs par défaut pour gérer les arguments optionnels ?
Les valeurs par défaut sont attribuées lors de la définition des paramètres. Si aucun argument n’est fourni à l’appel, la valeur par défaut est utilisée automatiquement, simplifiant la gestion des cas où un paramètre peut être facultatif.
Est-il possible de combiner *args et **kwargs dans une même fonction ?
Absolument, il est courant et recommandé de combiner ces deux paramètres pour construire des fonctions très flexibles capables d’accepter à la fois des arguments positionnels et nommés en nombre variable.
Comment passer un dictionnaire comme arguments nommés à une fonction ?
On utilise l’opérateur ** lors de l’appel de la fonction pour décompresser un dictionnaire et transmettre ses paires clé-valeur comme arguments nommés.
