39

デコレーターを使用して、さまざまな機能 (主に Django ビュー機能ですが、排他的ではありません) の監査を処理したいと考えています。これを行うために、実行後に関数を監査できるようにしたいと考えています。つまり、関数は通常どおり実行され、例外なく返された場合、デコレータはその事実をログに記録します。

何かのようなもの:

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

audit_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_funcdo_somethingdo_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 に答える