编程语言
首页 > 编程语言> > Python中的Monkey修补会影响直接导入吗?

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

作者:互联网

如果我猴子补丁模块:

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

解决方法:

是的,它将指向旧功能.

当从mod2中的mod import func做时,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

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

标签:python,import,namespaces,monkeypatching
来源: https://codeday.me/bug/20190626/1290532.html