4

一度だけ実行したいコードがデコレータに含まれています。他の多くの関数 (ユーティリティなど) は後で呼び出されるため、このデコレータを持つ可能性のある他の関数が関数呼び出しのネストで誤って使用されないようにしたいと考えています。

また、現在のコードがデコレータでラップされているかどうかをいつでも確認できるようにしたいと考えています。

私はこれを書きましたが、スタック内の一意の関数名をチェックするよりも優れた/よりエレガントなソリューションを他の誰かが考えられるかどうかを知りたかっただけです。

import inspect

def my_special_wrapper(fn):
    def my_special_wrapper(*args, **kwargs):
        """ Do some magic, only once! """
        # Check we've not done this before
        for frame in inspect.stack()[1:]:  # get stack, ignoring current!
            if frame[3] == 'my_special_wrapper':
                raise StandardError('Special wrapper cannot be nested')
        # Do magic then call fn
        # ...
        fn(*args, **kwargs)
    return my_special_wrapper

def within_special_wrapper():
    """ Helper to check that the function has been specially wrapped """
    for frame in inspect.stack():
        if frame[3] == 'my_special_wrapper':
            return True
    return False

@my_special_wrapper
def foo():
    print within_special_wrapper()
    bar()
    print 'Success!'

@my_special_wrapper    
def bar():
    pass

foo()
4

3 に答える 3