根据模块内另一个函数猴子补丁模块函数
我有一个模块里面的函数坏掉了。
这个坏掉的函数在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 个回答
4
你可以在你新写的函数里直接引用这个依赖:
import broken
def brokenfunc():
print "patched"
broken.dependency()
broken.brokenfunc = brokenfunc
或者你可以通过导入的方式,把dependency
添加到你的模块全局变量里:
import broken
from broken import dependency
def brokenfunc():
print "patched"
dependency()
broken.brokenfunc = brokenfunc
其实没必要这么麻烦;brokenfunc.__globals__
其实就是你当前模块的命名空间。