La manera más simple para envolver una función
func(*args, **kwargs)
... es escribir manualmente un envoltorio que llamar func() dentro de sí mismo:
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
En función de Python es una objeto, por lo que puede pasar su nombre como argumento de otra función y devolverlo. También puede escribir un generador de envolvente para cualquier función anyFunc():
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Tenga en cuenta también que en Python cuando no sabe o no quiere nombrar a todos los argumentos de una función, puede referirse a una tupla de argumentos, que se denota por su nombre, precedido por un asterisco en los paréntesis después del nombre de la función:
*args
por ejemplo, puede definir una función que tomar cualquier número de argumentos:
def testFunc(*args):
print args # prints the tuple of arguments
Python proporciona una manipulación aún mayor en los argumentos de la función. Puede permitir que una función tome argumentos de palabra clave. Dentro del cuerpo de la función, los argumentos de la palabra clave se mantienen en un diccionario. En los paréntesis después del nombre de la función de este diccionario se denota por dos asteriscos, seguido por el nombre del diccionario:
**kwargs
Un ejemplo similar que imprime el diccionario de argumentos de palabra clave:
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments
Una cosa que no he mencionado muy a menudo es cómo llamar a una función con * args, si tiene una lista o tupla que desea pasar. Para eso necesitas llamarlo así: wrapper1 (func2, * mylist) – pug
* args en 'def wrapper (func, * args)' es qué 'método (params object [] args)' está en C#. –
Tenga en cuenta que '* args' debe ser el último argumento en la definición de la función. –