lista - funciones en python
¿Cómo puedo hacer que un decorador de Python se ejecute después de que se haya completado la función decorada? (2)
Quiero usar un decorador para manejar la auditoría de varias funciones (principalmente funciones de visualización de Django, pero no exclusivamente). Para hacer esto, me gustaría poder auditar la función después de la ejecución , es decir, la función se ejecuta normalmente, y si regresa sin excepción, el decorador registra el hecho.
Algo como:
@audit_action(action=''did something'')
def do_something(*args, **kwargs):
if args[0] == ''foo'':
return ''bar''
else:
return ''baz''
Donde audit_action
solo se ejecutará después de que la función se haya completado.
Los decoradores generalmente devuelven una función de envoltorio; simplemente ponga su lógica en la función de envoltura después de invocar la función de envoltura.
def audit_action(action):
def decorator_func(func):
def wrapper_func(*args, **kwargs):
# Invoke the wrapped function first
retval = func(*args, **kwargs)
# Now do something here with retval and/or action
print ''In wrapper_func, handling action {!r} after wrapped function returned {!r}''.format(action, retval)
return retval
return wrapper_func
return decorator_func
Así que audit_action(action=''did something'')
es una fábrica de decoradores que devuelve un decorator_func
ámbito, que se utiliza para decorar tu do_something
( do_something = decorator_func(do_something)
).
Después de decorar, tu referencia de do_something
ha sido reemplazada por wrapper_func
. Llamar a wrapper_func()
hace que se do_something()
al do_something()
original, y luego tu código en la función wrapper puede hacer cosas.
El código anterior, combinado con su función de ejemplo, da el siguiente resultado:
>>> do_something(''foo'')
In wrapper_func, handling action ''did something'' after wrapped function returned ''bar''
''bar''
Tu decorador puede manejarlo aquí mismo, como
def audit_action(function_to_decorate):
def wrapper(*args, **kw):
# Calling your function
output = function_to_decorate(*args, **kw)
# Below this line you can do post processing
print "In Post Processing...."
return wrapper