根据模块内另一个函数猴子补丁模块函数

3 投票
1 回答
2636 浏览
提问于 2025-04-18 12:29

我有一个模块里面的函数坏掉了。

这个坏掉的函数在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__其实就是你当前模块的命名空间

撰写回答