【问题标题】:Does monkey patching in Python affect direct imports?Python 中的猴子补丁会影响直接导入吗?
【发布时间】:2012-05-20 16:54:02
【问题描述】:

如果我给一个模块打补丁:

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

【问题讨论】:

    标签: python import namespaces monkeypatching


    【解决方案1】:

    是的,它会指向旧函数。

    mod2 内执行from mod import func 时,func 将绑定在mod2 的范围内。
    Monkeypatching mod.func 会将 mod.func 绑定到新函数,但 modmod.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
    

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

    【讨论】:

    • 是的,我遇到过几次这种递归问题。 :)
    • 但是如果猴子补丁代码先运行,third_module 会指向新的函数吗?
    • @JamesLin 会的
    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多