我有以下密码,
In [4]: def foo():
...: a = 2
...: b = 3
...: return a + b
...:
...:
In [5]: import dis
In [6]: dis.dis(foo)
2 0 LOAD_CONST 1 (2)
2 STORE_FAST 0 (a)
3 4 LOAD_CONST 2 (3)
6 STORE_FAST 1 (b)
4 8 LOAD_FAST 0 (a)
10 LOAD_FAST 1 (b)
12 BINARY_ADD
14 RETURN_VALUE提及字节码:
我知道:
第一列是行号: 2,3,4,第三列是op-name: LOAD_CONST等。
第五栏是代码:(2) (a)
第二栏: 0,2,4,6,8.
和第四栏1,0,2,1
请你提供一个提示,以找到相关的信息?
发布于 2018-10-13 10:34:44
第二列是字节索引;每个字节由2个字节组成(一个表示确切的操作码,另一个表示opcode参数值)。它实际上是第4列;输出中有两列没有当前值。
对于您的函数,您可以找到包含字节码作为__code__.co_code属性的字节串:
>>> foo.__code__.co_code
b'd\x01}\x00d\x02}\x01|\x00|\x01\x17\x00S\x00'所以b'd\x01'是LOAD_CONST 1,b'}\x00'是STORE_FAST 0等等。
这在 function中有记录。
输出分为以下几列:
-->,>>表示的有标签的指令,使用dis.dis()时,第2列(当前指令)将始终为空。
无论何时有循环或测试,都会使用第3列,即标记的指令。例如:
>>> dis.dis('if foo:\n for i in it:\n print(i)\nelse: print(bar)')
1 0 LOAD_NAME 0 (foo)
2 POP_JUMP_IF_FALSE 28
2 4 SETUP_LOOP 30 (to 36)
6 LOAD_NAME 1 (it)
8 GET_ITER
>> 10 FOR_ITER 12 (to 24)
12 STORE_NAME 2 (i)
3 14 LOAD_NAME 3 (print)
16 LOAD_NAME 2 (i)
18 CALL_FUNCTION 1
20 POP_TOP
22 JUMP_ABSOLUTE 10
>> 24 POP_BLOCK
26 JUMP_FORWARD 8 (to 36)
4 >> 28 LOAD_NAME 3 (print)
30 LOAD_NAME 4 (bar)
32 CALL_FUNCTION 1
34 POP_TOP
>> 36 LOAD_CONST 0 (None)
38 RETURN_VALUE有4个跳跃目标,其中几个操作码可以触发跳转到其中一个位置。它们是一种视觉标记,以方便阅读。
https://stackoverflow.com/questions/52791981
复制相似问题