
En Python, en ajoutant * et ** (un ou deux astérisques) à la tête des noms de paramètres dans la définition de la fonction, vous pouvez spécifier un nombre arbitraire d’arguments (arguments de longueur variable) lors de l’appel de la fonction.
Par convention, les noms *args (arguments) et **kwargs (arguments de mots-clés) sont souvent utilisés, mais tant que * et ** sont en-têtes, il n’y a pas de problèmes avec les autres noms. L’exemple de code ci-dessous utilise les noms *args et **kwargs.
Cet article décrit le contenu suivant.
- *args : reçoit plusieurs arguments sous forme de tuple
- **kwargs : recevez plusieurs arguments de mots clés sous forme de dictionnaire
Consultez l’article suivant pour les bases des fonctions en Python.
Si vous ajoutez * et ** lors de l’appel d’une fonction, et non lors de la définition d’une fonction, vous pouvez décompresser et passer des listes et des dictionnaires aux arguments.
*args : reçoit plusieurs arguments sous forme de tuple
Si vous définissez un paramètre précédé de * comme *args, la fonction peut recevoir n’importe quel nombre d’arguments.
def my_sum(*args):
return sum(args)
print(my_sum(1, 2, 3, 4))
# 10
print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36
Dans la fonction, plusieurs arguments sont reçus sous forme de tuple. Dans l’exemple, un tuple est passé à la fonction sum() pour calculer la somme.
def my_sum2(*args):
print('args: ', args)
print('type: ', type(args))
print('sum : ', sum(args))
my_sum2(1, 2, 3, 4)
# args: (1, 2, 3, 4)
# type: <class 'tuple'>
# sum : 10
Il peut être utilisé avec des arguments positionnels.
La valeur spécifiée après (à droite) de l’argument de position est transmise sous forme de tuple à args. Si seuls des arguments positionnels sont passés, args sera un tuple vide.
def func_args(arg1, arg2, *args):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
func_args(0, 1, 2, 3, 4)
# arg1: 0
# arg2: 1
# args: (2, 3, 4)
func_args(0, 1)
# arg1: 0
# arg2: 1
# args: ()
Vous pouvez d’abord définir *args, mais dans ce cas, les paramètres définis après *args doivent être spécifiés par le format de mot-clé nom=valeur lors de l’appel de la fonction.
La dernière valeur n’est pas automatiquement transmise à l’argument de position, et si elle n’est pas spécifiée comme argument de mot-clé, TypeError est déclenché.
def func_args2(arg1, *args, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
# func_args2(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'
func_args2(0, 1, 2, 3, arg2=4)
# arg1: 0
# arg2: 4
# args: (1, 2, 3)
En utilisant cette propriété, il existe une technique pour définir un paramètre nommé * et utiliser ensuite un paramètre comme argument de mot clé uniquement.
def func_args_kw_only(arg1, *, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
# func_args_kw_only(100, 200)
# TypeError: func_args_kw_only() takes 1 positional argument but 2 were given
func_args_kw_only(100, arg2=200)
# arg1: 100
# arg2: 200
**kwargs : recevez plusieurs arguments de mots clés sous forme de dictionnaire
Si vous définissez un paramètre précédé de ** comme **kwargs, la fonction peut recevoir n’importe quel nombre d’arguments de mots-clés.
Dans la fonction, plusieurs arguments de mots clés sont reçus sous la forme d’un dictionnaire dont la clé est le nom de l’argument et dont la valeur est sa valeur.
def func_kwargs(**kwargs):
print('kwargs: ', kwargs)
print('type: ', type(kwargs))
func_kwargs(key1=1, key2=2, key3=3)
# kwargs: {'key1': 1, 'key2': 2, 'key3': 3}
# type: <class 'dict'>
Il peut également être utilisé avec des arguments positionnels.
def func_kwargs_positional(arg1, arg2, **kwargs):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('kwargs: ', kwargs)
func_kwargs_positional(0, 1, key1=1)
# arg1: 0
# arg2: 1
# kwargs: {'key1': 1}
En ajoutant ** à un objet dictionnaire lors de l’appel d’une fonction, vous pouvez passer chaque élément à chaque argument.
d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}
func_kwargs_positional(**d)
# arg1: 100
# arg2: 200
# kwargs: {'key1': 1, 'key2': 2}
Consultez l’article suivant pour plus de détails sur la décompression des arguments de fonction.
Un paramètre avec ** ne peut être défini qu’en dernier de la liste des paramètres. Si vous définissez un autre paramètre après le paramètre avec **, SyntaxError est déclenché.
# def func_kwargs_error(**kwargs, arg):
# print(kwargs)
# SyntaxError: invalid syntax
