Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按需装饰?_Python_Python Decorators - Fatal编程技术网

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,外形挂钩就是为了这个。