Python : nombre d’argument arbitraire avec **kwargs et *args
En python il est possible de construire des fonctions qui acceptent un nombre indéfini de paramètres, aussi bien en positionnel qu’en nommé.
*args
def mafonction(*args): for a in args: print(a) mafonction(1) # 1 mafonction(1,2,3) # 1 # 2 # 3
le *args
est interprété comme un tuple
**kwargs
def mafonction(param,*args,**kwargs): for a in kwargs: print(a,kwargs[a]) mafonction(nom="Dupont",age=27) #nom Dupont #age 27
Notez qu’il n’est pas nécessaire de les appeler *args et **kwargs, on peut utiliser d’autres noms.
On peut mixer ces deux types de paramètre avec des paramètres classiques
def mafonction(param1,*args,**kwargs):
Unpack argument list
Cette technique consiste à préfixer le paramètre d’un astérisque, pas lors de la déclaration de la fonction, mais lors de l’appel de la fonction.
def mafonction(a,b,c): print(a,b,c) obj = {"nom":"Dupont","age":27} mafonction(100,**obj) # 100,Dupont 27 def mafonction(a,b): print(a,b) l = [1,2] mafonction(*l) # 1 2
Pour les listes et tuple on utilisera *args, pour les dictionnaire on utilisera **
mylist = [1,2,3] >>> foo(*mylist) x=1 y=2 z=3 >>> mydict = {'x':1,'y':2,'z':3} >>> foo(**mydict) x=1 y=2 z=3 >>> mytuple = (1, 2, 3) >>> foo(*mytuple) x=1 y=2 z=3
Extended iterable unpacking
Une façon de faire de l’unpacking puissante
first, *rest = [1,2,3,4] first,*l,last = [1,2,3,4]
Enfin un esyntaxe propre à Python 3 :
def mafonction(arg1,arg2,*,kwarg1,kwarg2): pass
La syntaxe ci-dessus impose que les deux premiers paramètres soient positionnel, et les paramètre après l’astérisque soient nommés.