点播装饰?

时间:2013-10-03 12:19:41

标签: python python-decorators

我有一个名为Timer的装饰器,现在理想情况下,使用像这样的装饰器:

@Timer
def function(...):
    return None

但是,这会一直调用 function来调用Timer 。当然,当你想在特定的实例下调用它时,你可以使用像普通函数这样的装饰器:

function = Timer(function)

然而,这看起来并不漂亮(我很挑剔,我知道)。那么,有没有办法将装饰器包装在一个函数上,比如测试文件中的所有用例呢?所以,像:

from app import cheese

@Timer  # Syntax error
cheese  # Syntax error

请注意,如果您将它放在实际的函数定义之上,它只会使用装饰器来处理这个特定的文件,而不是所有的时间。

1 个答案:

答案 0 :(得分:1)

如果您可以在文件顶部启用/禁用(即您知道加载文件时是否要启用它们),则可以使用Enable/Disable Decorator

如果不是......你没有发布装饰器的源代码,但是没有理由它不能在包装代码本身中引用一个全局变量来启用/禁用。即装饰者看起来像这样:

@simple_decorator
def my_simple_logging_decorator(func):
    def you_will_never_see_this_name(*args, **kwargs):
        print 'calling {}'.format(func.__name__)
        return func(*args, **kwargs)
    return you_will_never_see_this_name

(来自https://wiki.python.org/moin/PythonDecoratorLibrary

只需为添加的代码添加一个警卫,即

@simple_decorator
def my_simple_logging_decorator(func):
    def you_will_never_see_this_name(*args, **kwargs):
# Added/modified code starts here
        if globalvar:
            print 'calling {}'.format(func.__name__)
# End modified code
        return func(*args, **kwargs)
    return you_will_never_see_this_name