Python 按需装饰?
我有一个名为Python 按需装饰?,python,python-decorators,Python,Python Decorators,我有一个名为Timer的装饰器,现在理想的情况是使用这样的装饰器: @Timer def function(...): return None 但是,这会在调用函数时始终调用计时器。现在,当您想在特定实例下调用装饰器时,您当然可以像普通函数一样使用装饰器来实现这一点: function = Timer(function) 然而,这看起来并不漂亮(我知道我很挑剔)。那么,有没有一种方法可以将一个decorator封装在一个函数上,比如说测试文件中的所有用例?比如说: from app
Timer
的装饰器,现在理想的情况是使用这样的装饰器:
@Timer
def function(...):
return None
但是,这会在调用函数时始终调用计时器。现在,当您想在特定实例下调用装饰器时,您当然可以像普通函数一样使用装饰器来实现这一点:
function = Timer(function)
然而,这看起来并不漂亮(我知道我很挑剔)。那么,有没有一种方法可以将一个decorator封装在一个函数上,比如说测试文件中的所有用例?比如说:
from app import cheese
@Timer # Syntax error
cheese # Syntax error
请注意,如果您将装饰器放置在实际函数定义之上,则它仅对该特定文件使用装饰器,而不是一直使用装饰器。如果您可以在文件顶部启用/禁用装饰器(即,您知道加载文件时是否要启用装饰器),则可以使用
如果不是。。。您没有发布decorator的源代码,但是没有理由它不能在包装代码本身中引用全局变量来启用/禁用。i、 e.装饰师看起来像这样:
@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
(来自)
只需为添加的代码添加一个保护,即
@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
装饰器语法只能在def
和class
之前使用。有什么原因不能只使用desugared变体吗?@DequeStarMapPartialSetttr没有,只是它在我的代码中看起来不太好,如果有更好的方法,那么我想知道。我只能假设这是针对某种特定于调用点的性能记录(说明用例在这种情况下有帮助)。这可能是可以做到的(对于您自己的代码),包括一些肮脏的堆栈帧攻击和一些时间惩罚(可以将其保留在性能数据之外)。OTOH,外形挂钩就是为了这个。