Подтвердить что ты не робот

Значение '>>' в байт-коде Python

Я разобрал следующий код python

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

и полученный байт-код

 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        

Что означают символы " → " в приведенном выше байт-коде?

4b9b3361

Ответ 1

Это прыгающие цели; позиции раньше *JUMP* байт-код переходит к выполнению условия.

Первый прыжок:

         9 POP_JUMP_IF_FALSE       16

переходит к смещению 16, поэтому при смещении 16 выход имеет цель >>:

4     >> 16 LOAD_FAST                0 (n)

В dis.disassemble() функции docs указывается каждый столбец:

[...]

  1. обозначенная инструкция, обозначенная символом >>,

и dis.findlabels() функция:

Обнаружить все смещения кода кода объекта, которые являются точками перехода, и вернуть список этих смещений.