如何在python包中修补内部私有函数?

时间:2014-01-06 20:42:53

标签: python monkeypatching

使用包pygal时,我必须更改pygal.util模块中的实用程序功能。此函数由其他模块中的其他函数调用。我如何修补此功能?现在,我已经在dist_packages中编辑了代码,但必须有一种方法可以动态分配给这个函数吗?

该功能为pygal.util.is_major。我试着通过以下方式做到: pygal.util.is_major = lambda x: False 但它不起作用。我认为这是因为包中的其他模块正在将此函数导入其本地名称空间。所以我改变它没有任何效果,因为旧版本的函数已经被其他模块导入到它们的本地命名空间中。

1 个答案:

答案 0 :(得分:3)

分配给is_major的原因不起作用是因为另外两个pygal模块在分配给它们之前将is_major导入到它们的本地名称空间。

pygal.graph.radar module

from pygal.util import deg, cached_property, compute_scale, is_major

pygal.graph.graph module

from pygal.util import (
    is_major, truncate, reverse_text_len, get_texts_box, cut, rad, decorate)

如果您可以在导入其中任何一个模块之前对is_major函数执行路径,那么它应该可以正常运行。如果你不能,你可以在猴子修补后reload图形模块。

这样的事情:

import pygal.util
import pygal.graph
import pygal.graph.radar

pygal.util.is_major = my_function
reload(pygal.graph)
reload(pygal.graph.radar)