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

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类是原始类型。对泛型类型类<T>的引用应参数化   java Windows服务进程被终止而不是停止   当参数由泛型方法返回时,Java11JVM没有选择正确的方法   Java中的opengl GLEnum?   语法为什么这个简单的java代码不能编译?   java如何检查Springboot或相关框架的所有符合条件的bean   java使用OpenCV中我自己的公式将RGB转换为灰色   JBoss缓存与JBoss服务器之间的java兼容性   类似facebook messenger的java聊天头,带有编辑文本,但编辑文本不显示在键盘上   子pom中未继承的java额外插件   java将注入字段声明为静态   java我可以否定点吗?   java Spring Security从何处获得其默认http配置?   尝试在weblogic 12c上部署war时发现java验证问题错误   java在交换机/机箱中添加等待?   macos如何从Java运行与自制或MacPorts一起安装的工具?   java下载谷歌电子表格使用谷歌电子表格api   java如何在eclipse或jarfileexplorer中查看jar文件的内容