Python中的monkey补丁会影响直接导入吗?

2024-06-08 20:15:17 发布

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

如果我给模块打补丁:

# mokeypatch.py
import other_module

def replacement(*args, **kwargs):
    pass

other_module.some_func = replacement

这会影响直接导入some_func的模块,还是取决于导入的顺序?如果第三个模块是这样的:

^{pr2}$

首先,运行这个代码,然后运行monkey补丁。third_module.some_func会是旧的吗?在


Tags: 模块pyimport顺序defargssomepass
1条回答
网友
1楼 · 发布于 2024-06-08 20:15:17

是的,它将指向旧函数。在

mod2内执行from mod import func时,func将被绑定在mod2的范围内。
Monkeypatching mod.func会将mod.func绑定到新函数,但是mod和{}都不知道{}甚至存在,即使他们知道(内部他们可能在某个地方知道),他们也不知道是否应该替换它。在

重新绑定导入的名称会有问题的一个实际示例如下:

# monkeypatch.py
import other_module
from other_module import func as orig_func
def replacement():
    do_stuff()
    orig_func()
    do_stuff()
other_module.func = replacement

如果它是反弹的,那么现在就有无限递归,并且无法调用原始函数。在

相关问题 更多 >