2016-07-13 1 views
0

Lorsqu'une fois, une fonction python est désassemblée à l'aide de la fonction dis, des lignes vides apparaissent entre certains opcodes, comme indiqué ci-dessous.Lignes vides dans le bytecode python

>>> 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 

Les >> sont utilisés pour indiquer des instructions marquées, mais je ne semblent pas obtenir ce que les lignes vides sont pour. Quelqu'un at-il une idée de ce que signifient ces lignes vides?

Répondre

1

Les lignes vides sont des interruptions entre les désassemblages d'instructions. Les nombres à l'avant des premières lignes du bloc sont les numéros de ligne de la source, en supposant que vous les ayez.

Par exemple:

def test(): 
    x = 1 
    y = 2 

sera affiché comme

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

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

Lorsque le 2 et 3 se réfèrent aux lignes 2 et 3 de la source d'origine.