2016-06-18 7 views
10

ich folgenden Python-Code zerlegt habeBedeutung des '>>' in Python-Bytecode

def factorial(n): 
    if n <= 1: 
     return 1 
    elif n == 2: 
     return 2 
    elif n ==4: 
     print('hi') 
    return n * 2 

und die daraus resultierende Bytecode

2  0 LOAD_FAST    0 (n) 
      3 LOAD_CONST    1 (1) 
      6 COMPARE_OP    1 (<=) 
      9 POP_JUMP_IF_FALSE   16 

3  12 LOAD_CONST    1 (1) 
     15 RETURN_VALUE   

4  >> 16 LOAD_FAST    0 (n) 
     19 LOAD_CONST    2 (2) 
     22 COMPARE_OP    2 (==) 
     25 POP_JUMP_IF_FALSE  32 

5  28 LOAD_CONST    2 (2) 
     31 RETURN_VALUE   

6  >> 32 LOAD_FAST    0 (n) 
     35 LOAD_CONST    3 (4) 
     38 COMPARE_OP    2 (==) 
     41 POP_JUMP_IF_FALSE  52 

7  44 LOAD_CONST    4 ('hi') 
     47 PRINT_ITEM   
     48 PRINT_NEWLINE  
     49 JUMP_FORWARD    0 (to 52) 

8  >> 52 LOAD_FAST    0 (n) 
     55 LOAD_CONST    2 (2) 
     58 BINARY_MULTIPLY  
     59 RETURN_VALUE   

Was tun, um die '>>' Symbole in der obigen Bytecode stehen für?

+0

Sieht aus wie Ziele für 'POP_JUMP_IF_FALSE'. Lesen Sie diesen Artikel: [Verständnis Python-Bytecode] (http://security.coverity.com/blog/2014/Nov/understanding-python-bytecode.html) –

+0

@self: Nein, eine Verschiebung nach rechts ist 'BINARY_RSHIFT' oder' INPLACE_RSHIFT '. –

Antwort

12

Sie sind Sprungziele; Positionen früher *JUMP* Bytecode springt auf, wenn die Bedingung erfüllt ist.

Der erste Sprung:

  9 POP_JUMP_IF_FALSE  16 

Sprünge 16 zu kompensieren, so dass bei 16 versetzt die Ausgabe hat ein Ziel >>:

4  >> 16 LOAD_FAST    0 (n) 

Aus den dis.disassemble() function docs Namen jede Spalte:

[...]

  1. eine markierte Anweisung, angegeben mit >>,

und dis.findlabels() function:

alle Versätze Detect in dem Objektcode, die Sprungziele, und eine Liste dieser Offsets zurückgeben.

Verwandte Themen