Python offre une façon de gérer un nombre arbitraire d'arguments dans une fonction grâce à des symboles spéciaux. Ces symboles sont * et **, et sont utilisés devant les noms de variables pour indiquer respectivement *args et **kwargs. Vous pouvez donner aux paramètres *args ou **kwargs les noms que vous souhaitez, mais par convention, on les appelle args (arguments) et kwargs (arguments nommés).
*args est utilisé pour envoyer un nombre arbitraire d'arguments à la fonction sans utiliser de mots-clés. Voici un exemple :
def add(*args):
res = 0 # Initialise le résultat final à 0
for num in args: # Parcourt la liste des arguments passés
res += num # Ajoute chaque nombre à la somme
return res
print(add(3, 5, 7, 9)) # 24
Dans ce programme, args est un tuple contenant les valeurs que nous passons à la fonction. Ainsi, dans l'exemple ci-dessus, args est égal à (3, 5, 7, 9). De cette manière, nous pouvons passer n'importe quel nombre d'arguments à notre fonction.
**kwargs
**kwargs nous permet de passer un nombre arbitraire d'arguments avec des mots-clés. En d'autres termes, nous utilisons **kwargs pour passer n'importe quel nombre d'arguments nommés à notre fonction. Voici un exemple :
def introduce(**kwargs):
for key, value in kwargs.items(): # Parcourt toutes les paires clé-valeur
print(f'{key}: {value}') # Affiche chaque paire clé-valeur
introduce(Name='Alice', Age=25, Country='USA')
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'
Dans le programme ci-dessus, kwargs est un dictionnaire contenant les paires clé-valeur que nous passons à la fonction. Ainsi, dans l'exemple précédent, kwargs est égal à {'Name': 'Alice', 'Age': 25, 'Country': 'USA'}.
Vous pouvez également combiner *args et **kwargs dans un appel de fonction. *args doit venir avant **kwargs.
def combined_example(*args, **kwargs):
print(args) # Affiche le tuple des arguments
print(kwargs) # Affiche le dictionnaire des arguments nommés
combined_example(1, 2, 3, Name='Alice', Age=25)
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}
Dans cette fonction, args est un tuple avec les valeurs (1, 2, 3) et kwargs est un dictionnaire avec les valeurs {'Name': 'Alice', 'Age': 25}.
Cette flexibilité de gestion d'un nombre quelconque d'arguments et d'arguments nommés peut être très utile lorsque vous souhaitez que vos fonctions soient plus dynamiques et polyvalentes.
Combiner *args et **kwargs avec des arguments de fonction réguliers
*args et **kwargs peuvent être utilisés en combinaison avec des arguments de fonction classiques. Dans ces cas, vous devez garder à l'esprit quelques règles :
L'ordre correct des arguments dans la définition de la fonction doit être : arguments standards, *args, puis **kwargs.
Les arguments standards (également appelés arguments positionnels) doivent toujours être spécifiés avant *args et **kwargs.
def function_example(a, b, *args, **kwargs):
print(a) # Affiche le premier argument standard
print(b) # Affiche le deuxième argument standard
print(args) # Affiche les arguments supplémentaires non nommés
print(kwargs) # Affiche les arguments nommés
function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}
Ici, 1 et 2 sont des arguments standards qui correspondent à a et b dans la définition de la fonction. Le tuple (3, 4, 5) représente les arguments supplémentaires regroupés dans args. Les arguments nommés restants sont regroupés dans kwargs en tant que dictionnaire.
Lorsque vous utilisez *args et **kwargs avec des arguments standards, assurez-vous de ne pas oublier les arguments standards lors de l'appel de la fonction, car cela provoquerait une TypeError. Par exemple, appeler function_example(1, Name='Alice', Age=25) sans fournir de valeur pour l'argument b entraînerait une erreur.