39

我想使用装饰器来处理各种功能的审核(主要是 Django 视图功能,但不限于此)。为了做到这一点,我希望能够在执行后审核函数- 即函数正常运行,如果它无异常返回,那么装饰器会记录这一事实。

就像是:

@audit_action(action='did something')
def do_something(*args, **kwargs):
    if args[0] == 'foo':
        return 'bar'
    else:
        return 'baz'

whereaudit_action只会在函数完成后运行。

4

2 回答 2

57

装饰器通常返回一个包装函数;只需在调用包装函数后将您的逻辑放入包装函数中。

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

一个装饰器工厂也是如此audit_action(action='did something'),它返回一个作用域decorator_func,用于装饰你的do_something( do_something = decorator_func(do_something))。

装饰后,您的do_something参考已被替换wrapper_func。调用wrapper_func()会导致调用原始代码do_something(),然后包装器 func 中的代码可以执行操作。

上面的代码与您的示例函数相结合,提供以下输出:

>>> do_something('foo')
In wrapper_func, handling action 'did something' after wrapped function returned 'bar'
'bar'
于 2013-02-05T08:48:14.243 回答
9

你的装饰器可以自己在这里处理它,比如

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 output
    return wrapper
于 2013-02-05T08:50:33.777 回答