La façon la plus simple d'envelopper une fonction
func(*args, **kwargs)
... est d'écrire manuellement un wrapper qui appellerait func() à l'intérieur de lui-même :
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
En Python, une fonction est un objet, vous pouvez donc passer son nom comme argument d'une autre fonction et le retourner. Vous pouvez également écrire un générateur d'enveloppe pour n'importe quelle fonction anyFunc() :
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Notez également qu'en Python, lorsque vous ne connaissez pas ou ne voulez pas nommer tous les arguments d'une fonction, vous pouvez vous référer à un tuple d'arguments, qui est désigné par son nom, précédé d'un astérisque entre les parenthèses qui suivent le nom de la fonction :
*args
Par exemple, vous pouvez définir une fonction qui prendrait n'importe quel nombre d'arguments :
def testFunc(*args):
print args # prints the tuple of arguments
Python permet une manipulation encore plus poussée des arguments des fonctions. Vous pouvez autoriser une fonction à prendre des arguments de type mot-clé. Dans le corps de la fonction, les arguments des mots-clés sont conservés dans un dictionnaire. Dans les parenthèses qui suivent le nom de la fonction, ce dictionnaire est indiqué par deux astérisques suivis du nom du dictionnaire :
**kwargs
Un exemple similaire qui imprime le dictionnaire des arguments des mots-clés :
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments