我想听一些第三方库方法的调用。值得注意的是,我想对我正在听的这些方法附加某种反馈方法。例如,每当调用logging.info(msg,* args,** kwargs)时,我都希望有一个单独的方法,同时也会触发相同的参数列表。
我能找到的最接近的是mock module的side_effect功能。但如果我错了,请纠正我,此功能将完全覆盖函数的原始行为,而不是标记函数。
那里有一个能满足我需要的模块,还是我不得不劫持我需要的功能?
编辑:澄清标题。
答案 0 :(得分:3)
使用装饰器样式方法劫持并不太难:
def hijack(obj, func_name):
orig_func = getattr(obj, func_name)
def wrapped_func(*args, **kwargs):
print(orig_func, args, **kwargs)
return orig_func(*args, **kwargs)
setattr(obj, func_name, wrapped_func)
有了这个,你可以修补一个类(这也适用于模块等):
class A:
def f(self):
pass
您可以劫持A.f
方法,例如:
hijack(A, "f")
导致:
a = A()
a.f()
产:
<function A.f at 0x7fc56b034620> (<__main__.A object at 0x7fc56b01df28>,)
logging
:
import logging
hijack(logging, "warning")
logging.warning("hi")
产地:
<function warning at 0x7f83355c8a60> ('hi',)
WARNING:root:hi
答案 1 :(得分:0)
也许是“毫不客气”,但我认为它能做到你想要的......
def hook(*args, **kwargs):
# do stuff with args and kwargs
hook.original(*args, **kwargs)
hook.original = logging.info
logging.info = hook
不幸的是,除非你也想听第三方图书馆的电话。