【发布时间】:2014-01-24 09:12:52
【问题描述】:
使用pygal 包时,我必须更改pygal.util 模块中的实用功能。该函数被其他模块中的其他函数调用。我如何猴子修补这个功能?现在,我已经编辑了 dist_packages 中的代码,但必须有一种方法可以动态分配给这个函数?
函数是pygal.util.is_major。我试图通过以下方式做到这一点:
pygal.util.is_major = lambda x: False
但它不起作用。我认为这是因为包中的其他模块正在将此函数导入到它们的本地命名空间中。所以我改变它没有任何效果,因为旧版本的函数已经被其他模块导入到它们的本地命名空间中。
【问题讨论】:
-
当您尝试直接分配给函数时会发生什么?即
pygal.util.whatever = new_func -
是你在模块级别、类方法、实例方法上猴子补丁的函数吗?
-
@Narcolei 这不是万无一失的,因为在应用猴子补丁之前创建的其他命名空间中保存的任何引用都不会更新到补丁方法,但直接分配通常涵盖大多数情况,特别是如果您确保在程序执行中尽早进行修补。
-
@SilasRay 当然,这就是我发表评论而不是答案的原因。
-
您可以尝试获取函数对象并使用
gc.get_referrers()循环遍历对该函数的每个引用,然后修补每个对象引用以指向您的覆盖方法。 (以及进行上述简单的分配修补以处理创建的任何未来引用。)
标签: python monkeypatching