查找模块中的所有修饰函数

时间:2010-01-27 02:08:29

标签: python

是否可以确定函数是否在运行时修饰?例如,我可以在模块中找到由“example”修饰的所有函数吗?

@example
def test1():
    print "test1"

5 个答案:

答案 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)