我在一个破坏的模块中有一个函数
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()
显然,我必须覆盖全局变量,因为补丁模块中的依赖关系是在补丁模块中定义的,并且会在那里寻找依赖关系。
这有效,但我对黑客不满意。我试图更新整个全局字典,但在这种情况下,我覆盖太多,破碎的功能保持运行。这是正确的做法(考虑角落案例)还是另一种正确的策略?
答案 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
只是您当前的模块命名空间。