将函数调用注入 python 函数

Inject function calls into python function

假设我在模块中有一些简单的python函数

def f(x):
    print(x)

这个函数只是打印它的参数。但是,我想修改这个函数或class方法,具体取决于它的实际情况。

我还有第二个功能:

def g(x):
    x.append(1)

操作输入参数(可能是 list)并附加一些项目。现在,我想将对 g 的调用注入到 f 中,以便后者表现得像

def f_patched(x):
    g(x)
    print(x)

显然,这可以通过猴子修补 f 来完成。然而,这并不总是实用的,特别是如果 f 是一些更大的函数,因为我将不得不复制大部分代码(如果这甚至是合法的)只是为了改变一行。通过注入对 g 的调用给定一些参考,例如“行 XXX 之后”或“指令 XXX 之后”,我可以轻松修改 f.

的行为

有没有办法将函数调用注入到不同的函数中?你可以假设,我知道 f 的来源,或者至少 f 是众所周知的,并且 不变 这成为可能。

也许您可以在程序的早期(即在首次调用之前)重新定义该函数,以将其替换为您的补丁版本:

import myModule

# before this f() is the original

old_f = myModule.f           # capture a reference to the original
def f_patched(x):
    g(x)                     # inject your code
    return old_f(x)          # use the original
myModule.f = f_patched       # replace the original

# from here onward, f() will be the patched version that calls the original