Fc4de650c3e5c6997598d6cef20c4b35
番外:Python字节码的复杂示例

番外:Python字节码的复杂示例

上文中我们讲述了Python字节码的构成,本文通过一个具体复杂的例子来串讲整个流程。

>>> def example(a, b):
...     for i in range(a, b):
...             print i
... 

在上述这个例子,代码虽短,但是功能逻辑上确实比较全了,包含如下几块内容:

  • 函数参数

  • 循环体

  • 迭代器

  • 其他函数调用

  • 局部变量

好,通过dis.dis函数,我们可以获得反编译的结果,具体如下:

  2           0 SETUP_LOOP              28 (to 31)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_FAST                0 (a)
              9 LOAD_FAST                1 (b)
             12 CALL_FUNCTION            2
             15 GET_ITER            
        >>   16 FOR_ITER                11 (to 30)
             19 STORE_FAST               2 (i)

  3          22 LOAD_FAST                2 (i)
             25 PRINT_ITEM          
             26 PRINT_NEWLINE       
             27 JUMP_ABSOLUTE           16
        >>   30 POP_BLOCK           
        >>   31 LOAD_CONST               0 (None)
             34 RETURN_VALUE        

首先印入眼帘的就是SETUP_LOOP,通过这个名字我们不难推断出这是设置循环体的,那么紧随其后的28这个操作数是干嘛的呢?

循环体顾名思义,可以视为是一个包含判断条件的执行体。那么这个执行体的开始的部分假设是0,那么终结的部分呢?

top Created with Sketch.