用于可逆地将函数/对象替换为代理函数/对象的工具,用于调试、测试和猴子修补。

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回购协议在这里:

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
空字符串检查在java中未按预期工作   JavaSpringWebClient:自动计算主体的HMAC签名并将其作为头传递   foreach是否有一个Java等效的foreach循环和一个引用变量?   java如何在Eclipse中导入jar   使用特定第三方或java时lombok触发错误。*方法或构造函数   安卓 java将对象数组转换为int数组   java使一定百分比的JUnit测试通过   java Android:将Seekbar的一个值与另一个值进行比较   java将int数组(图像数据)写入文件的最佳方式是什么   java取代了系统。yml的构造函数内的getProperty   sqlite Java将公钥和私钥转换为字符串,然后再转换回字符串   安卓获取白色像素并将其保存到java opencv中的数组中   java为什么是ServerSocket。setSocketFactory静态?   Java数组似乎在不直接修改的情况下更改值