4

如果我修补一个模块:

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

4

1 回答 1

4

是的,它将指向旧功能。

from mod import func在里面做的时候mod2func会被绑定在范围内mod2
Monkeypatchingmod.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

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

于 2012-05-12T09:18:53.957 回答