用于可逆地将函数/对象替换为代理函数/对象的工具,用于调试、测试和猴子修补。
pyjack的Python项目详细描述
pyjack是一个调试/测试/猴子修补工具集,允许您可逆地 将内存中对函数或对象的all引用替换为 代理函数或对象。PyJack有两个主要功能:
函数“connect”可以将“proxy”函数连接到几乎 任何python函数/方法。调用此代理函数而不是 原始功能。但是,原始函数被传递给代理 与所有args、kwargs一起使用,以便您可以执行如下操作:
- 首先修改参数kwargs,打印调试消息,然后调用原始 功能
- 不调用该函数,只需记录它并打印调试消息即可
等等等等——一切由你决定。
“全部替换”功能可用于全部替换 对一个对象的引用与对另一个对象的引用。这将取代所有 整个内存空间中的引用。你得到最后一个参考 原始引用,因此可以再次调用此函数来还原 记忆状态恢复到原来的状态。
“连接”功能
>>> import pyjack >>> >>> def fakeimport(orgopen, *args, **kwargs): ... print 'Trying to import %s' % args[0] ... return 'MODULE_%s' % args[0] ... >>> pyjack.connect(__import__, proxyfn=fakeimport) <..._PyjackFuncBuiltin object at 0x...> >>> >>> import time Trying to import time >>> print time MODULE_time >>> >>> __import__.restore() >>> >>> import time >>> print time <module 'time' (built-in)>
“replace_all_refs”功能
设置“项目”引用并将其放在几个位置:
>>> item = (100, 'one hundred') >>> data = {item: True, 'itemdata': item} >>> >>> class Foobar(object): ... the_item = item ... >>> def outer(datum): ... def inner(): ... return ("Here is the datum:", datum,) ... ... return inner ... >>> inner = outer(item) >>> >>> print item (100, 'one hundred') >>> print data {'itemdata': (100, 'one hundred'), (100, 'one hundred'): True} >>> print Foobar.the_item (100, 'one hundred') >>> print inner() ('Here is the datum:', (100, 'one hundred'))
然后更换:
>>> new = (101, 'one hundred and one') >>> org_item = pyjack.replace_all_refs(item, new) >>> >>> print item (101, 'one hundred and one') >>> print data {'itemdata': (101, 'one hundred and one'), (101, 'one hundred and one'): True} >>> print Foobar.the_item (101, 'one hundred and one') >>> print inner() ('Here is the datum:', (101, 'one hundred and one'))
但您仍然有one对组织数据的最终引用:
>>> print org_item (100, 'one hundred')
所以这个过程是可逆的:
>>> new = pyjack.replace_all_refs(new, org_item) >>> >>> print item (100, 'one hundred') >>> print data {'itemdata': (100, 'one hundred'), (100, 'one hundred'): True} >>> print Foobar.the_item (100, 'one hundred') >>> print inner() ('Here is the datum:', (100, 'one hundred'))
其他参考资料
有关完整文档和几个示例,请访问:
Git回购协议在这里: