2016-07-13 16 views
0

Wenn Sie einmal eine Python-Funktion mit der Funktion dis disassemblieren, sind zwischen einigen Opcodes Leerzeilen, wie unten gezeigt.Leere Zeilen in Python-Bytecode

>>> dis(fizzbuzz) 
    2   0 LOAD_FAST    0 (n) 
       3 LOAD_CONST    1 (3) 
       6 BINARY_MODULO 
       7 LOAD_CONST    2 (0) 
      10 COMPARE_OP    2 (==) 
      13 POP_JUMP_IF_FALSE  36 
      16 LOAD_FAST    0 (n) 
      19 LOAD_CONST    3 (5) 
      22 BINARY_MODULO 
      23 LOAD_CONST    2 (0) 
      26 COMPARE_OP    2 (==) 
      29 POP_JUMP_IF_FALSE  36 

    3   32 LOAD_CONST    4 ('FizzBuzz') 
      35 RETURN_VALUE 

    4  >> 36 LOAD_FAST    0 (n) 
      39 LOAD_CONST    1 (3) 
      42 BINARY_MODULO 
      43 LOAD_CONST    2 (0) 
      46 COMPARE_OP    2 (==) 
      49 POP_JUMP_IF_FALSE  56 

    5   52 LOAD_CONST    5 ('Fizz') 
      55 RETURN_VALUE 

    6  >> 56 LOAD_FAST    0 (n) 
      59 LOAD_CONST    3 (5) 
      62 BINARY_MODULO 
      63 LOAD_CONST    2 (0) 
      66 COMPARE_OP    2 (==) 
      69 POP_JUMP_IF_FALSE  76 

    7   72 LOAD_CONST    6 ('Buzz') 
      75 RETURN_VALUE 

    9  >> 76 LOAD_GLOBAL    0 (str) 
      79 LOAD_FAST    0 (n) 
      82 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      85 RETURN_VALUE 
      86 LOAD_CONST    0 (None) 
      89 RETURN_VALUE 

Die >> verwendet markierte Anweisungen, um anzuzeigen, aber ich scheine für nicht zu bekommen, was die Leerzeilen sind. Hat jemand eine Ahnung, was diese leeren Zeilen bedeuten?

Antwort

1

Die Leerzeilen sind Brüche zwischen den Demontagen von Anweisungen. Die Zahlen an der Vorderseite der ersten Zeilen des Blocks sind die Zeilennummern der Quelle, vorausgesetzt, Sie haben sie.

Zum Beispiel:

def test(): 
    x = 1 
    y = 2 

wird zeigen, wie

2   0 LOAD_CONST    1 (1) 
      3 STORE_FAST    0 (x) 

3   6 LOAD_CONST    2 (2) 
      9 STORE_FAST    1 (y) 

Wo die 2 und 3 Linien 2 und 3 der ursprünglichen Quelle beziehen.