如何在python中更改现有第三方库中的函数

时间:2012-05-03 10:30:15

标签: python

这是一个问我的面试问题。如果没有意义,请不要惩罚我。她问道:

“我在python中有一个现有的第三方库,其中有一个函数foo()。如何在导入现有模块后修改该函数?”

2 个答案:

答案 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来解决此限制。

使用猴子修补是快速修复库的好方法。提交错误报告并等待修补程序可能需要一段时间,因此您可以通过这种方式自助,而无需深入了解库源代码。