将函数调用注入 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
假设我在模块中有一些简单的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