Kwargs vs args en Python

Cet article présente les différences entre les arguments passés à une fonction en Python avec args et kwargs.

Le problème

En python, on peut passer des arguments à une fonction en utilisant args et kwargs.

Imaginez que vous souhaitez un jour créer une fonction qui calcule le produit de tous les arguments. L’approche naïve, est la suivante. Plus il y a d’arguments, mieux c’est.

def product(a=1, b=1, c=1, d=1, e=1, f=1):
    return a * b * c * d * e * f

Si nous souhaitons passer exactement 6 arguments, cette fonction n’aura aucun mal à fonctionner. Cependant, on peut se douter que cela ne sera pas possible sur le long terme si nous souhaitons passer un nombre plus grand d’arguments.

Une solution serait de passer les arguments dans un tuple, une liste ou n’importe quelle autre structure de données. Nous allons voir que c’est possible nativement par python grâce aux arguments “args” et “kwargs”.

Args

Voyons directement comment nous pouvons transformer notre fonction product en une fonction avec args.

def product(*args):
    res = 1
    for arg in args:
        res *= arg
    return res

product(1, 2, 3, 4, 5, 6)

Args est ici un tuple. Cela permet de passer autant d’arguments que nous souhaitons à la fonction.

args (et kwargs) est uniquement un nom de variable, il est possible d’écrire la fonction def product(*data) si vous préférez. L’important est l’astérisque.

Kwargs

Comme nous allons le voir, il n’y a pas une grande différence entre kwargs et args. Kwargs signifie Keyword Arguments.

def product(**kwargs):
    res = 1
    for key, value in kwargs.items(): # kwargs est un dictionnaire
        res *= value
    return res

product(a=1, b=2, c=3, d=4, e=5, f=6) 

Kwargs est un dictionnaire. Cela permet ainsi de passer autant de couples clé/valeur que nous souhaitons à la fonction product.

Kwargs et Args dans la même fonction.

Rappel

En python, les “arguments optionnels” (avec des valeurs par défaut) sont placés en dernier.

def product(a, b, c=1, d=1, e=1, f=1):
    return a * b * c * d * e * f

product(1, 2)

Il n’est pas possible de passer c=1 avant b. Cela retounerait une erreur.

Combinaison des deux

Comme vu dans le rappel, il y a un ordre dans les arguments d’une fonction. L’ordre est le suivant :

  1. Arguments standards
  2. Arguments optionnels
  3. Arguments *args
  4. Arguments **kwargs

Ainsi pour la fonction suivante :

def showNumbers(a, b, *c, **d):
    print(a)
    print(b)
    print(c)
    print(d)

showNumbers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, postFinalNumber = 19, finalNumber = 20)

Nous donne le résultat suivant :

1
2
(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)
{'postFinalNumber': 19, 'finalNumber': 20}