是否可以确定函数是否在运行时修饰?例如,我可以在模块中找到由“example”修饰的所有函数吗?
@example
def test1():
print "test1"
答案 0 :(得分:9)
在一般情况下,这是不可能的,因为example
装饰器可能不会留下任何在运行时可检测到的痕迹 - 例如,可能
def example(f):
return f
如果您确实控制了example
的来源,那么它很容易标记或记录它正在装饰的功能;如果你不这样做,完全不可能做你想做的事。
答案 1 :(得分:8)
由于您已表明可以控制包装器代码,因此这是一个示例:
def example(f):
f.wrapped = True
return f
@example
def test1():
print "test1"
def test2():
print "test2"
print test1.wrapped
print hasattr(test2, 'wrapped')
答案 2 :(得分:3)
我认为没有一般方法,因为装饰器是一个简单的函数调用。您的代码与此相同:
def test1():
print "test1"
test1 = example(test1)
您可以通过反汇编和分析(使用dis
模块)来检测特定装饰器。或者你可以简单地解析源文件,虽然这有点难看。
为什么要首先检测它们?
答案 3 :(得分:0)
您可能会发现这个最近的问题提供了有关3种方法的详细信息:
Howto get all methods of a python class with given decorator
答案 4 :(得分:-1)
如果可以的话,在运行时monkeypatch装饰器以捕获传递给它的函数:
decfuncs = []
def decpatch(dec):
def catchdec(func, *args, **kwargs):
decfuncs.append(func)
return dec(func, *args, **kwargs)
return catchdec
somemodule.somedecorator = decpatch(somemodule.somedecorator)