如何在 Python 运行时修补函数中的一行

How to patch one line in a function in Python runtime

我正在使用第 3 方库来解析某些特定于域的文件。好的是库可以正常工作,坏的是库有一些我想修改的小问题,不好的是我正在使用的函数大约有 2000 行。我只想修改 if 表达式中的一个正则表达式,有没有一种方法可以 "hotfix" 在不修改原始库的情况下?

您可以在 with 语句中使用 unittest.mock.patch 来交换任何内容。如果没有看到代码,我无法确切地告诉你如何去做,但如果正则表达式已经在全局中,你可以在调用期间替换它。

如果它是由函数内部编写的字符串文字构成的,您可以改为修补它传递给的任何函数,如 re.compilere.match 等。制作一个包装器来检查那个要替换的字符串,替换它,然后委托给真正的函数。 (在 with 语句之外保存对真实事物的引用,如果您不希望堆栈溢出,请使用它:)


old_compile = re.compile
with patch.object(re, 'compile', lambda s: old_compile('eggs' if s == 'spam' else s)):
    bad_library_function()

此示例假设 bad_library_function 调用了 re.compile,其中包含您不喜欢的字符串文字 'spam',您希望它是 eggs。该补丁将其替换为一个新函数,该函数将 'spam' 参数视为 'eggs' 并且在其他方​​面与原始 re.compile 函数一样,但仅在 with 期间有效]声明。


这种猴子修补方法非常脆弱。如果您更新库并更改了实现,您的补丁可能会中断。