这是一个问我的面试问题。如果没有意义,请不要惩罚我。她问道:
“我在python中有一个现有的第三方库,其中有一个函数foo()。如何在导入现有模块后修改该函数?”
答案 0 :(得分:2)
这称为猴子修补。简而言之,您只需分配给保存函数的变量:
import existingmodule
existingmodule.foo = lambda *args, **kwargs: "You fail it"
这在实践中很少是正确的答案。用你自己的函数包装一些东西,或者在别处提供你自己的实现,或者使用继承(如果是一个类的方法),会好得多。
执行此操作的唯一原因是,您需要将更改后的行为反映在库自己的代码(或其他第三方代码)中;如果是这样,那就试试吧。这通常是一种比创建自己的fork更好的方法;也就是说,将代码作为补丁提交可能是一个好主意,所以如果项目被接受,不仅仅是你支持它。
答案 1 :(得分:1)
最常见的方法是Monkey patching(参见:stackoverflow: what is monkey patching)
例如:
>>> import os
>>> os.listdir('.')
['file_a', 'file_b']
>>> os.listdir = lambda folder: ['nothing in here, nope!']
>>> os.listdir('.')
['nothing in here, nope!']
在PyCon 2012上有一个非常好的talk主题,您可以在youtube上观看
该演讲还提供了一个非常好的示例,说明猴子修补可能有用:
假设你有第三方图书馆做某件事。要做到这一点,这个脚本需要以root身份运行 - 但实际功能不需要root权限。现在,第三方库可能正在使用os.geteuid() == 0
进行检查。
通过猴子修补使用此库的代码,您可以覆盖geteuid
伪造为root来解决此限制。
使用猴子修补是快速修复库的好方法。提交错误报告并等待修补程序可能需要一段时间,因此您可以通过这种方式自助,而无需深入了解库源代码。