猴子根据模块内的另一个功能修补模块功能

时间:2014-07-08 11:43:00

标签: python

我在一个破坏的模块中有一个函数

broken.py

def brokenfunc():
    dependency()


def dependency():
    print "hello"

例程依赖于另一个函数依赖,这很好。我需要破坏补丁,所以在另一个模块中我做了

patched.py

import broken

def brokenfunc():
    print "patched"

    dependency()

brokenfunc.__globals__["dependency"]=broken.brokenfunc.__globals__["dependency"]
broken.brokenfunc = brokenfunc

broken.brokenfunc()

显然,我必须覆盖全局变量,因为补丁模块中的依赖关系是在补丁模块中定义的,并且会在那里寻找依赖关系。

这有效,但我对黑客不满意。我试图更新整个全局字典,但在这种情况下,我覆盖太多,破碎的功能保持运行。这是正确的做法(考虑角落案例)还是另一种正确的策略?

1 个答案:

答案 0 :(得分:1)

您可以在新功能中引用依赖关系:

import broken

def brokenfunc():
    print "patched"

    broken.dependency()

broken.brokenfunc = brokenfunc

或者您可以通过导入将<{1}}添加到模块全局变量中:

dependency

真的没有必要这么做; import broken from broken import dependency def brokenfunc(): print "patched" dependency() broken.brokenfunc = brokenfunc 只是您当前的模块命名空间