怎么装饰从文件导入的所有函数

2024-10-01 09:31:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了许多被分成不同文件的函数,现在我想对所有这些函数应用同一个装饰器,而不需要修改文件,也不需要逐个应用装饰器。在

我尝试过使用由delnan编写的this explanation,但是对于导入的函数我没有成功。在

关于decorator,它必须在每次用函数参数和值执行类中的函数时更新一个列表,就像我要求的this other question。在

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


Tags: 文件函数列表装饰decorator函数参数this建议
1条回答
网友
1楼 · 发布于 2024-10-01 09:31:35

稍微反省一下(^{})和使用^{}^{}进行动态查找。在

首先,我们迭代在module和check for objects that look like functions中找到的所有名称。之后,我们简单地用装饰过的函数重新分配旧函数。在

主.py:

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

^{pr2}$

输出:

<function f at 0x101e309d8>
2
<function g at 0x101e30a60>
7

如果使用星型导入(from mymod import *),过程就不会那么顺利。原因很简单-因为所有的名字都放在一个大袋子里,它们来自哪里没有区别,你需要很多额外的技巧来找到你想要修补的东西。但是,这就是为什么我们使用名称空间-because they are one honking great idea。在

相关问题 更多 >