usar lista funciones ejecutar desde consola como comandos archivo python decorator python-decorators

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