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

如何在python包中修补内部私有函数?,python,monkeypatching,Python,Monkeypatching,使用包pygal时,我必须更改pygal.util模块中的实用程序函数。此函数由其他模块中的其他函数调用。如何对该功能进行猴子补丁?现在,我已经编辑了dist_包中的代码,但是必须有一种方法来动态分配给这个函数 函数为pygal.util.is\u major。我尝试了以下方法: pygal.util.is_major=lambda x:False 但它不起作用。我认为这是因为包中的其他模块正在将此函数导入其本地名称空间。因此,我更改它没有任何效果,因为该函数的旧版本已由其他模块导入到其本地名称

使用包
pygal
时,我必须更改
pygal.util
模块中的实用程序函数。此函数由其他模块中的其他函数调用。如何对该功能进行猴子补丁?现在,我已经编辑了dist_包中的代码,但是必须有一种方法来动态分配给这个函数

函数为
pygal.util.is\u major
。我尝试了以下方法:
pygal.util.is_major=lambda x:False

但它不起作用。我认为这是因为包中的其他模块正在将此函数导入其本地名称空间。因此,我更改它没有任何效果,因为该函数的旧版本已由其他模块导入到其本地名称空间。

分配给is\u major不起作用的原因是,另外两个pygal模块在分配给它之前将
is\u major
导入其本地名称空间

委员会:

如果您可以在导入这些模块之前使用
is_major
函数,那么它应该可以工作。如果不能,则可以在猴子补丁之后创建图形模块

大概是这样的:

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

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

当您尝试直接分配给函数时会发生什么?i、 e.
pygal.util.whatever=new_func
是在模块级、类方法、实例方法?@Narcolei上进行猴子补丁的函数吗?这不是傻瓜式的,因为在应用猴子补丁之前创建的其他命名空间中的任何引用都不会更新为补丁方法,但直接赋值通常涵盖大多数情况,特别是如果您确保在程序执行过程中尽早进行修补。@SilasRay当然,这就是我发布注释而不是答案的原因。您可以尝试获取函数对象并使用
gc.get\u referers()
循环遍历函数的每个引用,然后修补每个对象引用以指向覆盖方法。(同时进行上述简单的分配修补,以处理将来创建的任何引用。)
from pygal.util import (
    is_major, truncate, reverse_text_len, get_texts_box, cut, rad, decorate)
import pygal.util
import pygal.graph
import pygal.graph.radar

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