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是旧的吗?
是的,它将指向旧函数。
from mod import func在里面做的时候mod2,func会被限制在 的范围内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)
如果是反弹,你现在就会有无限递归,并且无法调用原始函数。
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |