我的问题类似于这个问题
不同的是,我不能在thirdpartymodule_b
中执行dosomething()
,所以我需要对thirdpartymodule_a
进行猴子补丁,并在thirdpartymodule_b
中执行它时生效。
我认为你提到的问题和你自己的情况并没有什么不同。在两种情况下,模块都会从另一个模块中导入名称,并且您想要修补该名称引用的对象。
在那个问题中,模块是作者编写的,在您的问题中,它是第三方模块。
我认为您的问题在于第三方已经导入了该对象名称,因此如果您尝试替换该模块中驻留的对象,则第三方模块仍将使用旧对象,因为它仍然引用旧对象。
module_1.py
class AForm(Form):
...
module_2.py
from module_1 import AForm
module_2
并且使用monkey-patch替换AForm
为另一个对象。class AFormPatched(Form):
...
import module_1
module_1.AForm = AFormPatched
module_2
,因为module_2.AForm
仍然指向原始对象。
要解决这个问题:
选项1。 module_2
应该像这样:
import module_1
module_1.AForm # using AForm in this form
选项2。 也要修补 module_2.AForm
:
class AFormPatched(Form):
...
import module_1
module_1.AForm = AFormPatched
import module_2
module_2.AForm = AFormPatched
module_2
使用修补程序版本的module_1
。import third_party_module
third_party_module.AForm.__init__ = ...
thirdpartymodule_b
已经导入了thirdpartymodule_a
,我很想知道这是否可能。我以前从未能够做到这一点。 - 2rs2tsthirdpartymodule_b
使用补丁版本的thirdpartymodule_a
,而其他模块仍使用旧版本? - warvariuc