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

如何在Python运行时修补函数中的一行,python,monkeypatching,Python,Monkeypatching,我正在使用第三方库解析某些特定于域的文件。好的是库工作,坏的是库有一些小问题,我想修改,丑陋的是我正在使用的函数,大约有2000行。我只想在if表达式中修改一个正则表达式,有没有一种方法可以在不修改原始库的情况下进行“热修复”?您可以在with语句中使用它来替换任何内容。在没有看到代码的情况下,我无法确切地告诉您如何操作,但是如果regex已经在全局中,您可以在调用期间替换它 如果它是由写在函数内部的字符串文字组成的,那么您可以对传递给它的任何函数进行修补,如re.compile或re.matc

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

您可以在
with
语句中使用它来替换任何内容。在没有看到代码的情况下,我无法确切地告诉您如何操作,但是如果regex已经在全局中,您可以在调用期间替换它

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


本例假设
bad\u library\u函数
调用了
re.compile
,其中包含一个您不喜欢的字符串文本“spam”,您希望它是
egs
。该修补程序将其替换为一个新函数,该函数将
'spam'
参数视为
'egs'
,否则其行为将与原始
重新编译
函数相同,但仅在
with
语句期间有效



这种修补方法非常脆弱。如果更新库并更改实现,则修补程序可能会中断。

制作一个检查和修复输入的装饰程序?@severinpapadeux它将不起作用。此库将扫描一些日志文件,输出取决于扫描结果。较新版本的日志文件添加了一些可能破坏预定义正则表达式的信息。
old_compile = re.compile
with patch.object(re, 'compile', lambda s: old_compile('eggs' if s == 'spam' else s)):
    bad_library_function()