args et kwargs ???
Non, ce ne sont pas des personnages de Star Wars ;-)
Explication
Comme leurs noms l'indiquent, args (pour arguments ) et kwargs (keyword arguments) sont des arguments, donc des valeurs fournies à une fonction pour qu'elle donne un résultat.
Problème
Nous avons vu, jusque là, des fonctions où le nombre d'arguments est connu à l'avance. Par exemple :
def somme(nombre1,nombre2):
return nombre1 + nombre2
Mais, dans certains cas, le nombre d'arguments passés à la fonction n'est pas connu : reprenons la fonction somme en imaginant que l'utilisateur ne saura pas de combien de nombres il veut faire la somme...
Comment faire ?
Solution
def somme(*args):
result = 0
for arg in args:
result += arg
return result
print(somme(1,2,3)) # affiche 6
print(somme(1,2,3,4,5,6)) # affiche 21
Comprendre le programme
- args est un tuple. C'est une variable et son nom peut donc être changé : def somme(*nombre), par exemple.
- ce qui est important, c'est l'astérique * (qu'on appelle le splat) devant args qui est indispensable. Il indique que les données vont être empaquetées (packing) dans le tuple args.
Différence entre args et *kwargs
Comme pour *args, **kwargs permet de passer un nombre indéterminé d'arguments à une fonction.
Mais, cette fois, sous la forme d'un dictionnaire et non pas d'un tuple.
def somme(**kwargs):
resultat = 0
liste_clefs = []
for clef,valeur in kwargs.items(): # kwargs est un dictionnaire
liste_clefs.append(clef) # fait la liste des clefs du dictionnaire
resultat += valeur # fait la somme des valeurs du dictionnaire
return resultat,liste_clefs
print(somme(a=1,b=2,c=3)) # affiche (6, ['a', 'b', 'c'])
print(somme(a=1,b=2,c=3,d=4,e=5,f=6)) # affiche (21, ['a', 'b', 'c', 'd', 'e', 'f'])
Comprendre le programme
- kwargs est un dictionnaire. Là encore, c'est une variable et un nom différent peut lui être donné.
- le double astérisque ** indique que les valeurs passées en arguments seront empaquetées dans un dictionnaire
- for clef,valeur in kwargs.items() : le contenu est manipulé comme n'importe quel contenu de dictionnaire. Revoir la partie sur les dictionnaires si nécessaire.