如果我修补模块:
# mokeypatch.py
import other_module
def replacement(*args, **kwargs):
pass
other_module.some_func = replacement
这是否会影响直接导入some_func
的模块,还是会影响导入的顺序?如果第三个模块是这样的:
# third_module.py
from other_module import some_func
首先,运行此代码,然后运行我们的猴子补丁。 third_module.some_func
会不会是旧的?
答案 0 :(得分:4)
是的,它将指向旧功能。
在from mod import func
内执行mod2
时,func
将受mod2
范围限制。
Monkeypatching mod.func
会将mod.func
绑定到新功能,但mod
和mod.func
都不知道mod2.func
甚至存在 - 即使他们这样做(内部他们可能知道)它在哪里)他们不知道是否应该更换或现在。
为什么重新绑定导入的名称会有问题的一个实际例子是:
# 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
如果是反弹,你现在有无限递归,无法调用原始函数。