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