首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dis.dis(foo)中字段的正式名称

dis.dis(foo)中字段的正式名称
EN

Stack Overflow用户
提问于 2018-10-13 10:32:12
回答 1查看 38关注 0票数 0

我有以下密码,

代码语言:javascript
复制
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

请你提供一个提示,以找到相关的信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-13 10:34:44

第二列是字节索引;每个字节由2个字节组成(一个表示确切的操作码,另一个表示opcode参数值)。它实际上是第4列;输出中有两列没有当前值。

对于您的函数,您可以找到包含字节码作为__code__.co_code属性的字节串:

代码语言:javascript
复制
>>> foo.__code__.co_code
b'd\x01}\x00d\x02}\x01|\x00|\x01\x17\x00S\x00'

所以b'd\x01'LOAD_CONST 1b'}\x00'STORE_FAST 0等等。

这在 function中有记录。

输出分为以下几列:

  1. 行号,用于每一行的第一条指令
  2. 当前的指令,表示为-->
  3. >>表示的有标签的指令,
  4. 指令的地址,
  5. 操作代号,
  6. 操作参数,以及
  7. 圆括号中参数的解释。

使用dis.dis()时,第2列(当前指令)将始终为空。

无论何时有循环或测试,都会使用第3列,即标记的指令。例如:

代码语言:javascript
复制
>>> 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个跳跃目标,其中几个操作码可以触发跳转到其中一个位置。它们是一种视觉标记,以方便阅读。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52791981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档