Args et kwargs

args et kwargs ???

Non, ce ne sont pas des personnages de Star Wars ;-)

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

La fonction somme prend deux arguments et renvoie la somme des deux.

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.