有没有办法在应用于同一函数的两个python装饰器之间传递变量?目标是让一个装饰师知道另一个也被应用了。我需要以下示例中的decobar_present()之类的东西:
def decobar(f):
def wrap():
return f() + "bar"
return wrap
def decofu(f):
def wrap():
print decobar_present() # Tells me whether decobar was also applied
return f() + "fu"
return wrap
@decofu
@decobar
def important_task():
return "abc"
一般来说,我希望能够根据decobar是否也被应用来修改decofu的行为。在
每个装饰器都可以包装另一个函数。传递给
decofu()
的函数是decobar()
修饰符的结果。在只要测试
decobar
包装的特定特征,只要使包装可识别:我在wrapper函数上使用了一个任意属性,但是您可以尝试测试名称(不是那么明确)、签名(可能使用
inspect.getargspec()
)等这仅限于直接包装。在
一般来说,你不想把装修工像这样紧密地结合在一起。找出一个不同的解决方案,并且只依赖于函数签名或返回值。在
当}属性的完整性(在包装函数上使用
decobar
应用于“registry”时,可以将其添加到“registry”,然后检查注册表以确定decobar
是否应用于该函数。这种方法需要保持原始函数的__module__
和{functools.wraps
)。在使用一个类来实现}保存在一个名称空间中(IMO,这感觉更干净了)
decobar
,因为它将registry
和{虽然操作stack trace是可能的,但我认为,最好是创建一个函数
decofubar
,并尽可能多地合并“fu”和“bar”。至少,它会使你的代码更清晰、更明显。在相关问题 更多 >
编程相关推荐