Python monkey补丁由另一个模块执行的模块

时间:2014-02-21 02:14:51

标签: python

我的问题类似于question

除了在dosomething()中执行thirdpartymodule_b不是我的模块,所以我需要修补补丁thirdpartymodule_a并在thirdpartymodule_b

执行时生效

1 个答案:

答案 0 :(得分:1)

我认为您引用的问题与您的情况没有任何区别。在这两种情况下,模块都会从另一个模块导入名称,并且您希望修补该名称引用的对象。

在该问题中,该模块由作者撰写,在您的问题中,它是第三方模块。

我认为您的问题在于第三方已经导入了对象名称,因此如果您尝试替换它所在的模块中的对象,第三方模块仍将使用旧对象,因为它仍然引用旧对象。

module_1.py

class AForm(Form):
    ...

module_2.py

from module_1 import AForm

如果您导入module_2然后使用另一个对象module_1替换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_1修补module_2来修补已修补的版本。

选项3。对象的修补程序属性。如果您不希望或不能修补使用对象名称的所有位置,有时如果您不替换该对象,但仅修补其某些属性,则有效。这取决于您尝试修补的对象和行为:

import third_party_module
third_party_module.AForm.__init__ = ...