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

cul*_*rón 5 python import namespaces monkeypatching

如果我猴子修补一个模块:

# mokeypatch.py
import other_module

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

other_module.some_func = replacement
Run Code Online (Sandbox Code Playgroud)

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

# third_module.py
from other_module import some_func
Run Code Online (Sandbox Code Playgroud)

首先,运行此代码,然后运行我们的猴子补丁。会third_module.some_func是旧的吗?

Thi*_*ter 5

是的,它将指向旧函数。

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
Run Code Online (Sandbox Code Playgroud)

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