python 3的字节码操作(byteplay)库
byteplay3的Python项目详细描述
byteplay允许您将python代码对象转换为易于使用的等效对象,并允许您将这些对象转换回python代码对象。它有助于在python函数上应用转换,也有助于学习python字节码的复杂性。这个版本适用于Python3.4和3.5。
有关完整文档,请参阅位于
https://github.com/tallforasmurf/byteplay/blob/master/about.md
关于byteplay
----
byteplay3是一个模块,可以让您轻松地使用python字节码。
基本思想很简单:定义一个名为code的新类型,它等价于
对于python代码对象,但是代码对象与python代码对象不同,
很容易玩。任何python代码对象都可以转换为
代码对象,反之亦然,不会丢失任何重要信息。
在代码对象中,字节码指令用
易于检查和修改的方式。
兼容性
--
这个模块,byteplay3,是基于noam raph的原始版本,noam raph
仍然可以从PYPI获得。如果你有teplay使用的代码
python 2,只需更改导入行即可迁移到python 3
读取“from byteplay3 import*”。对于轻微的不兼容,请参见
“关于”上面链接的文件。当然你会发现
python 3字节码中的不兼容性,这一点已经有了很大的改变。
一个简单的例子
------
从一个愚蠢的函数开始,将其代码转换为代码对象并显示:
>>>定义f(a,b):
…打印(A,B)
…
>>>;f(3,5)
35
>>>>来自byteplay3导入*
>>>将函数f的代码对象转换为代码对象
>>>;c=代码。来自代码(f.\u代码)
<;byteplay3.code对象位于0x1030da3c8>;
>>gt;显示代码对象中的字节码元组
>>gt;打印(C.代码)
2 1加载全局打印
2快速加载
3快速加载
4调用函数2
5件上衣
6荷载系数无
7返回值
好了,现在我们开始玩吧!假设我们想改变函数,让它打印
按相反顺序排列的参数。为此,我们将插入一个rot-two操作码
将两个参数加载到堆栈后。(即,在
加载快速B并在调用函数2之前:
>;>;C.代码[4:4]=[(旋转二,无)]
然后用新对象替换函数f中的code对象:
>>>华氏度(3,5)
5 3
有关完整文档,请参阅位于
https://github.com/tallforasmurf/byteplay/blob/master/about.md
关于byteplay
----
byteplay3是一个模块,可以让您轻松地使用python字节码。
基本思想很简单:定义一个名为code的新类型,它等价于
对于python代码对象,但是代码对象与python代码对象不同,
很容易玩。任何python代码对象都可以转换为
代码对象,反之亦然,不会丢失任何重要信息。
在代码对象中,字节码指令用
易于检查和修改的方式。
兼容性
--
这个模块,byteplay3,是基于noam raph的原始版本,noam raph
仍然可以从PYPI获得。如果你有teplay使用的代码
python 2,只需更改导入行即可迁移到python 3
读取“from byteplay3 import*”。对于轻微的不兼容,请参见
“关于”上面链接的文件。当然你会发现
python 3字节码中的不兼容性,这一点已经有了很大的改变。
一个简单的例子
------
从一个愚蠢的函数开始,将其代码转换为代码对象并显示:
>>>定义f(a,b):
…打印(A,B)
…
>>>;f(3,5)
35
>>>>来自byteplay3导入*
>>>将函数f的代码对象转换为代码对象
>>>;c=代码。来自代码(f.\u代码)
<;byteplay3.code对象位于0x1030da3c8>;
>>gt;显示代码对象中的字节码元组
>>gt;打印(C.代码)
2 1加载全局打印
2快速加载
3快速加载
4调用函数2
5件上衣
6荷载系数无
7返回值
好了,现在我们开始玩吧!假设我们想改变函数,让它打印
按相反顺序排列的参数。为此,我们将插入一个rot-two操作码
将两个参数加载到堆栈后。(即,在
加载快速B并在调用函数2之前:
>;>;C.代码[4:4]=[(旋转二,无)]
然后用新对象替换函数f中的code对象:
>>>华氏度(3,5)
5 3