【发布时间】:2019-03-03 09:18:14
【问题描述】:
在尝试理解 python 中的条件装饰器时,我遇到了this example。该问题的公认答案解释了如何定义条件装饰器,而不是如何使用它。
示例代码如下:
class conditional_decorator(object):
def __init__(self, dec, condition):
self.decorator = dec
self.condition = condition
def __call__(self, func):
if not self.condition:
# Return the function unchanged, not decorated.
return func
return self.decorator(func)
@conditional_decorator(timeit, doing_performance_analysis)
def foo():
time.sleep(2)
但是如何使用它呢?我尝试了以下foo 的调用,如下所示:
doing_performance_analysis=False
foo()
doing_performance_analysis=True
foo()
但我收到以下错误:
Traceback (most recent call last):
File "tester.py", line 18, in <module>
@conditional_decorator(timeit, doing_performance_analysis)
NameError: name 'doing_performance_analysis' is not defined
那么它是如何正常工作的呢?
【问题讨论】:
-
正如 Martijn 在他的 cmets 中所说的那样,这只是有条件的,因为它是在 import 时间进行评估的。您不能在调用时更改它。
-
你得到的错误告诉你你没有设置名字
doing_performance_analysis。您是否尝试过将该名称定义为布尔值? -
我想我已经将该名称设置为布尔值,请参阅我的问题。我不确定你的意思是什么......
-
您需要在应用装饰器时设置它。这就是为什么
@conditional_decorator()行出现错误的原因。 -
所以当我需要在开头设置名称时,我根本没有条件装饰器,而是静态的,不可更改的装饰器......
标签: python