Python中的Monkey修补会影响直接导入吗?

时间:2012-05-12 09:14:50

标签: python import namespaces monkeypatching

如果我修补模块:

# 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会不会是旧的?

1 个答案:

答案 0 :(得分:4)

是的,它将指向旧功能。

from mod import func内执行mod2时,func将受mod2范围限制。
Monkeypatching mod.func会将mod.func绑定到新功能,但modmod.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

如果是反弹,你现在有无限递归,无法调用原始函数。