python:向一个中间人注入方法调用

时间:2015-04-15 15:19:10

标签: python methods python-mock

我想听一些第三方库方法的调用。值得注意的是,我想对我正在听的这些方法附加某种反馈方法。例如,每当调用logging.info(msg,* args,** kwargs)时,我都希望有一个单独的方法,同时也会触发相同的参数列表。

我能找到的最接近的是mock module的side_effect功能。但如果我错了,请纠正我,此功能将完全覆盖函数的原始行为,而不是标记函数。

那里有一个能满足我需要的模块,还是我不得不劫持我需要的功能?

编辑:澄清标题。

2 个答案:

答案 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

不幸的是,除非你也想听第三方图书馆的电话。