关于python:如何修饰从文件导入的所有函数?

How can I decorate all functions imported from a file?

我已经创建了许多函数,这些函数被分为不同的文件,现在我想在不修改文件和不逐个应用装饰器的情况下,对所有函数应用相同的装饰器。

我试过使用Delnan编写的这个解释,但是导入函数没有成功。

关于decorator,它必须在每次用函数参数和值执行类中的函数时更新一个列表,就像我问的另一个问题一样。

有什么建议可以帮助我解决这个问题吗?谢谢


有点自省(dir()和动态查找getattr()setattr()

首先,我们迭代在模块中找到的所有名称,并检查看起来像函数的对象。在那之后,我们简单地用装饰过的函数重新分配旧函数。

MY.PY:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import types
import functools

def decorate_all_in_module(module, decorator):
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, types.FunctionType):
            setattr(module, name, decorator(obj))

def my_decorator(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        print(f)
        return f(*args, **kwargs)
    return wrapper

import mymod1
decorate_all_in_module(mymod1, decorator)

MyMOD1.PY:

1
2
3
4
5
6
def f(x):
    print(x)


def g(x, y):
    print(x + y)

输出:

1
2
3
4
<function f at 0x101e309d8>
2
<function g at 0x101e30a60>
7

如果您使用star imports(from mymod import *),流程就不会那么顺利。原因很简单——因为所有的名字都在一个大袋子里,而且它们的来源没有区别,所以你需要很多额外的技巧来找到你想要修补的东西。但是,好吧,这就是我们使用名称空间的原因——因为它们是一个很好的主意。