我有一个名为Timer
的装饰器,现在理想情况下,使用像这样的装饰器:
@Timer
def function(...):
return None
但是,这会一直调用 function
来调用Timer 。当然,当你想在特定的实例下调用它时,你可以使用像普通函数这样的装饰器:
function = Timer(function)
然而,这看起来并不漂亮(我很挑剔,我知道)。那么,有没有办法将装饰器包装在一个函数上,比如测试文件中的所有用例呢?所以,像:
from app import cheese
@Timer # Syntax error
cheese # Syntax error
请注意,如果您将它放在实际的函数定义之上,它只会使用装饰器来处理这个特定的文件,而不是所有的时间。
答案 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