查找模块中所有装饰过的函数

9 投票
5 回答
12483 浏览
提问于 2025-04-15 18:31

在运行时,能不能知道一个函数是否被装饰器装饰过呢?比如说,我能不能找到一个模块里所有被“example”这个装饰器装饰的函数?

@example
def test1():
    print "test1"

5 个回答

3

我觉得没有一个通用的方法,因为装饰器其实就是一个简单的函数调用。你的代码和下面这个是一样的:

def test1():
    print "test1"

test1 = example(test1)

你可能可以通过拆解和分析(使用 dis 模块)来检测特定的装饰器。或者你也可以直接解析源文件,不过这样做有点麻烦。

你为什么想要检测它们呢?

14

因为你提到你可以控制包装代码,这里有一个例子:

def example(f):
    f.wrapped = True
    return f

@example
def test1():
    print "test1"

def test2():
    print "test2"


print test1.wrapped
print hasattr(test2, 'wrapped')
10

一般情况下,这是不可能的,因为example这个装饰器可能在运行时不会留下任何可以被检测到的痕迹——比如说,它可能是这样的

def example(f):
  return f

如果你能控制example的源代码,那当然很简单,你可以让它标记或者记录它所装饰的函数;但如果你不能控制,那你想要的事情可能完全不可能实现。

撰写回答