dis — Дизассемблер для байткода Python

Источник: Lib/dis.py


Модуль dis поддерживает анализ CPython bytecode путем его дизассемблирования. Байткод CPython, который этот модуль принимает на вход, определен в файле Include/opcode.h и используется компилятором и интерпретатором.

Детали реализации CPython: Байткод - это деталь реализации интерпретатора CPython. Нет никаких гарантий, что байткод не будет добавлен, удален или изменен между версиями Python. Использование этого модуля не должно рассматриваться как работа в разных виртуальных машинах Python или выпусках Python.

Изменено в версии 3.6: Используйте 2 байта для каждой инструкции. Ранее количество байт варьировалось в зависимости от инструкции.

Изменено в версии 3.10: Аргументом инструкций перехода, обработки исключений и циклов теперь является смещение инструкции, а не смещение байта.

Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими строчными записями в кэше, которые имеют вид инструкций CACHE. По умолчанию эти инструкции скрыты, но их можно показать, передав show_caches=True любой утилите dis. Кроме того, интерпретатор теперь адаптирует байткод, чтобы специализировать его для различных условий выполнения. Адаптивный байткод можно показать, передав adaptive=True.

Изменено в версии 3.12: Аргументом перехода является смещение целевой инструкции относительно инструкции, которая появляется сразу после входов CACHE инструкции перехода.

Как следствие, наличие инструкции CACHE прозрачно для прямых переходов, но должно учитываться при рассуждениях о обратных переходах.

Изменено в версии 3.13: В выводе отображаются логические метки, а не смещения инструкций для целей перехода и обработчиков исключений. Добавлены опция командной строки -O и аргумент show_offsets.

Пример: Дана функция myfunc():

def myfunc(alist):
    return len(alist)

Следующая команда может быть использована для отображения разборки myfunc():

>>> dis.dis(myfunc)
  2           RESUME                   0

  3           LOAD_GLOBAL              1 (len + NULL)
              LOAD_FAST                0 (alist)
              CALL                     1
              RETURN_VALUE

(«2» - это номер строки).

Интерфейс командной строки

Модуль dis может быть вызван как сценарий из командной строки:

python -m dis [-h] [-C] [-O] [infile]

Принимаются следующие варианты:

-h, --help

Отображение использования и выход.

-C, --show-caches

Показать встроенные кэши.

-O, --show-offsets

Показать смещения инструкций.

Если указан infile, то дизассемблированный код будет записан в stdout. В противном случае дизассемблирование выполняется на скомпилированном исходном коде, полученном из stdin.

Анализ байткода

Added in version 3.4.

API анализа байткода позволяет обернуть фрагменты кода Python в объект Bytecode, который обеспечивает легкий доступ к деталям скомпилированного кода.

class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False)

Проанализируйте байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращено compile()).

Это удобная обертка для многих функций, перечисленных ниже, в первую очередь get_instructions(), поскольку итерация над экземпляром Bytecode дает операции в байткоде для экземпляров Instruction.

Если first_line не None, он указывает номер строки, который должен быть сообщен для первой строки исходного текста в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.

Если current_offset не является None, то оно ссылается на смещение инструкции в дизассемблированном коде. Установка значения dis() выведет маркер «текущая инструкция» напротив указанного опкода.

Если show_caches имеет значение True, то dis() отобразит записи инлайн-кэша, используемые интерпретатором для специализации байткода.

Если значение adaptive равно True, то dis() будет отображать специализированный байткод, который может отличаться от исходного байткода.

Если show_offsets имеет значение True, то dis() будет включать в вывод смещения инструкций.

classmethod from_traceback(tb, *, show_caches=False)

Создайте экземпляр Bytecode из заданного traceback, установив current_offset на инструкцию, ответственную за исключение.

codeobj

Объект скомпилированного кода.

first_line

Первая строка исходного кода объекта (если доступна)

dis()

Возвращает форматированное представление операций байткода (то же самое, что выводит dis.dis(), но в виде многострочной строки).

info()

Возвращает отформатированную многострочную строку с подробной информацией об объекте кода, например code_info().

Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

Пример:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST
CALL
RETURN_VALUE

Функции анализа

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

dis.code_info(x)

Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для предоставленной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.

Обратите внимание, что точное содержимое информационных строк кода сильно зависит от реализации и может произвольно меняться в разных виртуальных машинах Python или выпусках Python.

Added in version 3.2.

Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.

dis.show_code(x, *, file=None)

Выведите подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в файл (или sys.stdout, если файл не указан).

Это удобное сокращение для print(code_info(x), file=file), предназначенное для интерактивного изучения в подсказке интерпретатора.

Added in version 3.2.

Изменено в версии 3.4: Добавлен параметр file.

dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False)

Разберите объект x. x может обозначать модуль, класс, метод, функцию, генератор, асинхронный генератор, корутину, объект кода, строку исходного кода или последовательность байт необработанного байткода. Для модуля дизассемблируются все функции. Для класса дизассемблируются все методы (включая методы класса и статические методы). Для объекта кода или последовательности необработанного байткода выводится по одной строке на каждую инструкцию байткода. Он также рекурсивно разбирает вложенные объекты кода. К ним могут относиться выражения-генераторы, вложенные функции, тела вложенных классов и объекты кода, используемые для annotation scopes. Перед дизассемблированием строки сначала компилируются в объекты кода с помощью встроенной функции compile(). Если объект не указан, функция дизассемблирует последний отслеженный объект.

Разборка записывается в виде текста в указанный аргумент file, если он указан, и в sys.stdout в противном случае.

Максимальная глубина рекурсии ограничена depth, если только она не равна None. depth=0 означает отсутствие рекурсии.

Если show_caches имеет значение True, эта функция отобразит записи инлайн-кэша, используемые интерпретатором для специализации байткода.

Если значение adaptive равно True, эта функция будет отображать специализированный байткод, который может отличаться от исходного байткода.

Изменено в версии 3.4: Добавлен параметр file.

Изменено в версии 3.7: Реализован рекурсивный дизассемблирование и добавлен параметр depth.

Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

distb(tb=None, *, file=None, show_caches=False, adaptive=False,
show_offset=False)

Разберите функцию верхнего стека трассировки, используя последнюю трассировку, если таковая не была передана. Указывается инструкция, вызвавшая исключение.

Разборка записывается в виде текста в указанный аргумент file, если он указан, и в sys.stdout в противном случае.

Изменено в версии 3.4: Добавлен параметр file.

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

Изменено в версии 3.13: Добавлен параметр show_offsets.

dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)
disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False,
show_offsets=False)

Разобрать объект кода, указав последнюю инструкцию, если было указано lasti. Вывод разделен на следующие колонки:

  1. номер строки, для первой инструкции каждой строки

  2. текущая инструкция, обозначенная как -->,

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

  4. адрес инструкции,

  5. кодовое имя операции,

  6. параметры работы, и

  7. интерпретация параметров в скобках.

Интерпретация параметров распознает имена локальных и глобальных переменных, значения констант, цели ветвления и операторы сравнения.

Разборка записывается в виде текста в указанный аргумент file, если он указан, и в sys.stdout в противном случае.

Изменено в версии 3.4: Добавлен параметр file.

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

Изменено в версии 3.13: Добавлен параметр show_offsets.

dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)

Возвращает итератор по инструкциям в указанной функции, методе, строке исходного кода или объекте кода.

Итератор генерирует серию именованных кортежей Instruction, содержащих детали каждой операции в поставляемом коде.

Если first_line не None, он указывает номер строки, который должен быть сообщен для первой строки исходного текста в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.

Параметр адаптивный работает так же, как и в dis().

Added in version 3.4.

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

Изменено в версии 3.13: Параметр show_caches устарел и не имеет никакого значения. Поле cache_info каждой инструкции заполняется независимо от его значения.

dis.findlinestarts(code)

Эта функция генератора использует метод co_lines() из code object кода, чтобы найти смещения, которые являются началом строк в исходном коде. Они генерируются в виде пар (offset, lineno).

Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.

Изменено в версии 3.10: Метод PEP 626 Метод co_lines() используется вместо атрибутов co_firstlineno и co_lnotab из code object.

Изменено в версии 3.13: Номера строк могут быть None для байткода, который не отображается на строки исходного текста.

dis.findlabels(code)

Определяет все смещения в необработанной строке компилированного байткода code, которые являются целями перехода, и возвращает список этих смещений.

dis.stack_effect(opcode, oparg=None, *, jump=None)

Вычислить стековый эффект opcode с аргументом oparg.

Если в коде есть цель прыжка и jump равно True, то stack_effect() вернет стековый эффект прыжка. Если jump равно False, то вернется стековый эффект отсутствия прыжка. А если jump равно None (по умолчанию), то будет возвращен максимальный стековый эффект из обоих случаев.

Added in version 3.4.

Изменено в версии 3.8: Добавлен параметр прыжок.

Изменено в версии 3.13: Если oparg опущен (или None), то теперь возвращается эффект стека для oparg=0. Ранее это было ошибкой для опкодов, использующих свой аргумент. Также больше не является ошибкой передача целого числа oparg, когда opcode не использует его; oparg в этом случае игнорируется.

Инструкции байткода Python

Функция get_instructions() и класс Bytecode предоставляют детали инструкций байткода в виде экземпляров Instruction:

class dis.Instruction

Подробности для операции байткода

opcode

числовой код операции, соответствующий значениям опкода, перечисленным ниже, и значениям байткода в Коллекции опкодов.

opname

человекочитаемое имя для операции

baseopcode

числовой код базовой операции, если операция является специализированной; в противном случае равен opcode.

baseopname

Человекочитаемое имя для базовой операции, если операция является специализированной; в противном случае равно opname.

arg

числовой аргумент операции (если есть), иначе None

oparg

псевдоним для arg

argval

разрешенное значение arg (если есть), иначе None

argrepr

человекочитаемое описание аргумента операции (если таковой имеется), в противном случае - пустая строка.

offset

начальный индекс операции в последовательности байткода

start_offset

начальный индекс операции в последовательности байткода, включая операции с префиксом EXTENDED_ARG, если он присутствует; в противном случае равен offset

cache_offset

начальный индекс записей кэша, следующих за операцией

end_offset

конечный индекс записей кэша, следующих за операцией

starts_line

True, если этот опкод начинает исходную строку, иначе False

line_number

номер строки исходного текста, связанный с этим опкодом (если таковой имеется), иначе None

is_jump_target

True, если другой код переходит сюда, иначе False

jump_target

индекс байткода цели перехода, если это операция перехода, иначе None

positions

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

Added in version 3.4.

Изменено в версии 3.11: Добавляется поле positions.

Изменено в версии 3.13: Изменено поле starts_line.

Добавлены поля start_offset, cache_offset, end_offset, baseopname, baseopcode, jump_target, oparg, line_number и cache_info.

class dis.Positions

Если информация недоступна, некоторые поля могут иметь значение None.

lineno
end_lineno
col_offset
end_col_offset

Added in version 3.11.

В настоящее время компилятор Python генерирует следующие инструкции байткода.

Общие указания

В дальнейшем мы будем обозначать стек интерпретатора как STACK и описывать операции над ним, как если бы это был список Python. Вершина стека в этом языке соответствует STACK[-1].

NOP

Код «ничего не делать». Используется в качестве заполнителя оптимизатором айтекода и для генерации событий трассировки строк.

POP_TOP

Удаляет верхний элемент стека:

STACK.pop()
END_FOR

Удаляет верхний элемент стека. Эквивалентно POP_TOP. Используется для очистки в конце циклов, отсюда и название.

Added in version 3.12.

END_SEND

Реализует del STACK[-2]. Используется для очистки при выходе генератора.

Added in version 3.12.

COPY(i)

Переместите i-й элемент на вершину стопки, не снимая его с исходного места:

assert i > 0
STACK.append(STACK[-i])

Added in version 3.11.

SWAP(i)

Поменяйте верхнюю часть стека на i-й элемент:

STACK[-i], STACK[-1] = STACK[-1], STACK[-i]

Added in version 3.11.

CACHE

Этот опкод не является инструкцией, а используется для разметки дополнительного места, чтобы интерпретатор мог кэшировать полезные данные непосредственно в самом байткоде. Он автоматически скрывается всеми утилитами dis, но может быть просмотрен с помощью show_caches=True.

Логически это пространство является частью предшествующей инструкции. Многие опкоды ожидают, что за ними последует точное количество кэшей, и предписывают интерпретатору пропустить их во время выполнения.

Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует быть очень осторожным при чтении или модификации необработанного, адаптивного байткода, содержащего ускоренные данные.

Added in version 3.11.

Обычные операции

Унарные операции берут вершину стека, применяют операцию и переносят результат обратно в стек.

UNARY_NEGATIVE

Реализует STACK[-1] = -STACK[-1].

UNARY_NOT

Реализует STACK[-1] = not STACK[-1].

Изменено в версии 3.13: Теперь эта инструкция требует точного операнда bool.

UNARY_INVERT

Реализует STACK[-1] = ~STACK[-1].

GET_ITER

Реализует STACK[-1] = iter(STACK[-1]).

GET_YIELD_FROM_ITER

Если STACK[-1] является объектом generator iterator или coroutine, он оставляется как есть. В противном случае реализуется STACK[-1] = iter(STACK[-1]).

Added in version 3.5.

TO_BOOL

Реализует STACK[-1] = bool(STACK[-1]).

Added in version 3.13.

Двоичные операции и операции с местами.

Бинарные операции удаляют два верхних элемента из стека (STACK[-1] и STACK[-2]). Они выполняют операцию, а затем помещают результат обратно в стек.

Операции in-place похожи на бинарные операции, но операция выполняется in-place, если STACK[-2] поддерживает ее, а результирующий STACK[-1] может быть (но не обязан быть) исходным STACK[-2].

BINARY_OP(op)

Реализует бинарные и in-place операторы (в зависимости от значения op):

rhs = STACK.pop()
lhs = STACK.pop()
STACK.append(lhs op rhs)

Added in version 3.11.

BINARY_SUBSCR

Орудия:

key = STACK.pop()
container = STACK.pop()
STACK.append(container[key])
STORE_SUBSCR

Орудия:

key = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[key] = value
DELETE_SUBSCR

Орудия:

key = STACK.pop()
container = STACK.pop()
del container[key]
BINARY_SLICE

Орудия:

end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
STACK.append(container[start:end])

Added in version 3.12.

STORE_SLICE

Орудия:

end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
values = STACK.pop()
container[start:end] = value

Added in version 3.12.

Открытые коды программ.

GET_AWAITABLE(where)

Реализует STACK[-1] = get_awaitable(STACK[-1]), где get_awaitable(o) возвращает o, если o является объектом coroutine или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешает o.__await__.

Если операнд where ненулевой, он указывает место выполнения команды:

  • 1: После вызова __aenter__

  • 2: После вызова __aexit__

Added in version 3.5.

Изменено в версии 3.11: Ранее эта инструкция не имела oparg.

GET_AITER

Реализует STACK[-1] = STACK[-1].__aiter__().

Added in version 3.5.

Изменено в версии 3.7: Возврат ожидаемых объектов из __aiter__ больше не поддерживается.

GET_ANEXT

Внесите STACK.append(get_awaitable(STACK[-1].__anext__())) в стек. Подробности о get_awaitable см. в разделе GET_AWAITABLE.

Added in version 3.5.

END_ASYNC_FOR

Завершает цикл async for. Обрабатывает исключение, возникшее при ожидании следующего элемента. Стек содержит асинхронный итерируемый элемент в STACK[-2] и поднятое исключение в STACK[-1]. Оба они вытаскиваются. Если исключение не находится в StopAsyncIteration, оно поднимается повторно.

Added in version 3.8.

Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не трех элементов.

CLEANUP_THROW

Обрабатывает исключение, возникшее во время вызова throw() или close() в текущем кадре. Если STACK[-1] является экземпляром StopIteration, извлеките из стека три значения и вставьте его член value. В противном случае повторно поднимите STACK[-1].

Added in version 3.12.

BEFORE_ASYNC_WITH

Решает __aenter__ и __aexit__ из STACK[-1]. Перемещает __aexit__ и результат __aenter__() в стек:

STACK.extend((__aexit__, __aenter__())

Added in version 3.5.

Различные опкоды.

SET_ADD(i)

Орудия:

item = STACK.pop()
set.add(STACK[-i], item)

Используется для реализации понимания множеств.

LIST_APPEND(i)

Орудия:

item = STACK.pop()
list.append(STACK[-i], item)

Используется для реализации понимания списков.

MAP_ADD(i)

Орудия:

value = STACK.pop()
key = STACK.pop()
dict.__setitem__(STACK[-i], key, value)

Используется для реализации вычислений dict.

Added in version 3.1.

Изменено в версии 3.8: Значение карты - STACK[-1], а ключ карты - STACK[-2]. Раньше эти значения были обратными.

Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, пока добавленное значение или пара ключ/значение выводится из цикла, объект-контейнер остается в стеке, чтобы быть доступным для последующих итераций цикла.

RETURN_VALUE

Возвращает STACK[-1] вызывающему функцию.

RETURN_CONST(consti)

Возвращает co_consts[consti] вызывающему функцию.

Added in version 3.12.

YIELD_VALUE

Из generator получается STACK.pop().

Изменено в версии 3.11: oparg задает глубину стека.

Изменено в версии 3.12: oparg - глубина блока исключений для эффективного закрытия генераторов.

Изменено в версии 3.13: oparg имеет значение 1, если эта инструкция является частью команды yield-from или await, и 0 в противном случае.

SETUP_ANNOTATIONS

Проверяет, определен ли __annotations__ в locals(), если нет, то устанавливается в пустой dict. Этот опкод выдается только в том случае, если тело класса или модуля статически содержит variable annotations.

Added in version 3.6.

POP_EXCEPT

Вытаскивает из стека значение, которое используется для восстановления состояния исключения.

Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не трех элементов.

RERAISE

Повторно поднимает исключение, находящееся на вершине стека. Если oparg ненулевое, извлекает из стека дополнительное значение, которое используется для установки f_lasti текущего кадра.

Added in version 3.9.

Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не трех элементов.

PUSH_EXC_INFO

Вытаскивает значение из стека. Выталкивает текущее исключение на вершину стека. Возвращает в стек первоначально выгруженное значение. Используется в обработчиках исключений.

Added in version 3.11.

CHECK_EXC_MATCH

Выполняет сопоставление исключений для except. Проверяет, является ли STACK[-2] исключением, соответствующим STACK[-1]. Выбрасывает STACK[-1] и вставляет булевский результат проверки.

Added in version 3.11.

CHECK_EG_MATCH

Выполняет сопоставление исключений для except*. Применяет split(STACK[-1]) к группе исключений, представляющих STACK[-2].

В случае совпадения вынимает два элемента из стека и вставляет не совпадающую подгруппу (None в случае полного совпадения), за которой следует совпадающая подгруппа. Если совпадения нет, вынимается один элемент (тип совпадения) и выталкивается None.

Added in version 3.11.

WITH_EXCEPT_START

Вызывает функцию в позиции 4 на стеке с аргументами (type, val, tb), представляющими исключение на вершине стека. Используется для реализации вызова context_manager.__exit__(*exc_info()), когда исключение произошло в операторе with.

Added in version 3.9.

Изменено в версии 3.11: Функция __exit__ находится в позиции 4 стека, а не 7. Представление исключений в стеке теперь состоит из одного, а не трех элементов.

LOAD_COMMON_CONSTANT

Заносит в стек обычную константу. Интерпретатор содержит жестко закодированный список констант, поддерживаемых этой инструкцией. Используется оператором assert для загрузки AssertionError.

Added in version 3.14.

LOAD_BUILD_CLASS

Помещает builtins.__build_class__() в стек. Позже он будет вызван для создания класса.

BEFORE_WITH

Этот опкод выполняет несколько операций перед запуском блока with. Во-первых, он загружает __exit__() из менеджера контекста и помещает его в стек для последующего использования WITH_EXCEPT_START. Затем вызывается __enter__(). Наконец, в стек помещается результат вызова метода __enter__().

Added in version 3.11.

GET_LEN

Выполнить STACK.append(len(STACK[-1])).

Added in version 3.10.

MATCH_MAPPING

Если STACK[-1] является экземпляром collections.abc.Mapping (или, более технично: если в его tp_flags установлен флаг Py_TPFLAGS_MAPPING), поместите True в стек. В противном случае занесите False.

Added in version 3.10.

MATCH_SEQUENCE

Если STACK[-1] является экземпляром collections.abc.Sequence и не является экземпляром str/bytes/bytearray (или, более технично: если в его tp_flags установлен флаг Py_TPFLAGS_SEQUENCE), поместите True в стек. В противном случае занесите False.

Added in version 3.10.

MATCH_KEYS

STACK[-1] - кортеж ключей отображения, а STACK[-2] - субъект соответствия. Если STACK[-2] содержит все ключи из STACK[-1], вставьте tuple, содержащий соответствующие значения. В противном случае вставьте None.

Added in version 3.10.

Изменено в версии 3.11: Ранее эта инструкция также передавала булево значение, указывающее на успех (True) или неудачу (False).

STORE_NAME(namei)

Реализует name = STACK.pop(). namei - это индекс name в атрибуте co_names из code object. Компилятор старается использовать STORE_FAST или STORE_GLOBAL, если это возможно.

DELETE_NAME(namei)

Реализует del name, где namei - индекс атрибута co_names в code object.

UNPACK_SEQUENCE(count)

Распаковывает STACK[-1] на count отдельных значений, которые помещаются в стек справа налево. Требуется, чтобы было ровно count значений.:

assert(len(STACK[-1]) == count)
STACK.extend(STACK.pop()[:-count-1:-1])
UNPACK_EX(counts)

Реализует присваивание со звездообразной целью: Распаковывает итерируемую переменную в STACK[-1] на отдельные значения, причем общее количество значений может быть меньше количества элементов в итерируемой переменной: одним из новых значений будет список всех оставшихся элементов.

Количество значений до и после значения списка ограничено 255.

Количество значений перед значением списка кодируется в аргументе опкода. Количество значений после списка, если таковые имеются, кодируется с помощью EXTENDED_ARG. Как следствие, аргумент можно рассматривать как двухбайтовое значение, где младший байт counts - это количество значений до значения списка, старший байт counts - количество значений после него.

Извлеченные значения помещаются в стек справа налево, т.е. a, *b, c = d после выполнения будет сохранен как STACK.extend((a, b, c)).

STORE_ATTR(namei)

Орудия:

obj = STACK.pop()
value = STACK.pop()
obj.name = value

где namei - индекс имени в co_names из code object.

DELETE_ATTR(namei)

Орудия:

obj = STACK.pop()
del obj.name

где namei - индекс имени в co_names из code object.

STORE_GLOBAL(namei)

Работает как STORE_NAME, но сохраняет имя как глобальное.

DELETE_GLOBAL(namei)

Работает как DELETE_NAME, но удаляет глобальное имя.

LOAD_CONST(consti)

Перемещает co_consts[consti] в стек.

LOAD_NAME(namei)

Перемещает значение, связанное с co_names[namei], в стек. Имя ищется в locals, затем в globals, затем в builtins.

LOAD_LOCALS

Выносит в стек ссылку на словарь locals. Это используется для подготовки словарей пространств имен для LOAD_FROM_DICT_OR_DEREF и LOAD_FROM_DICT_OR_GLOBALS.

Added in version 3.12.

LOAD_FROM_DICT_OR_GLOBALS(i)

Выгружает отображение из стека и ищет значение для co_names[namei]. Если имя там не найдено, оно ищется в глобальных переменных, а затем во встроенных, аналогично LOAD_GLOBAL. Это используется для загрузки глобальных переменных в annotation scopes внутри тел классов.

Added in version 3.12.

BUILD_TUPLE(count)

Создает кортеж, потребляющий count элементов из стека, и помещает полученный кортеж в стек.:

assert count > 0
STACK, values = STACK[:-count], STACK[-count:]
STACK.append(tuple(values))
BUILD_LIST(count)

Работает как BUILD_TUPLE, но создает список.

BUILD_SET(count)

Работает как BUILD_TUPLE, но создает набор.

BUILD_MAP(count)

Выталкивает новый объект словаря в стек. Размещает элементы 2 * count так, чтобы словарь содержал количество записей: {..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.

Изменено в версии 3.5: Словарь создается из элементов стека вместо того, чтобы создавать пустой словарь, заранее рассчитанный на количество элементов.

BUILD_CONST_KEY_MAP(count)

Версия BUILD_MAP, специализированная для константных ключей. Вытаскивает верхний элемент стека, содержащий кортеж ключей, затем, начиная с STACK[-2], вытаскивает count значений для формирования значений в построенном словаре.

Added in version 3.6.

BUILD_STRING(count)

Конкатенирует count строк из стека и помещает полученную строку в стек.

Added in version 3.6.

LIST_EXTEND(i)

Орудия:

seq = STACK.pop()
list.extend(STACK[-i], seq)

Используется для создания списков.

Added in version 3.9.

SET_UPDATE(i)

Орудия:

seq = STACK.pop()
set.update(STACK[-i], seq)

Используется для создания наборов.

Added in version 3.9.

DICT_UPDATE(i)

Орудия:

map = STACK.pop()
dict.update(STACK[-i], map)

Используется для построения диаграмм.

Added in version 3.9.

DICT_MERGE(i)

Как и DICT_UPDATE, но вызывает исключение для дублирующихся ключей.

Added in version 3.9.

LOAD_ATTR(namei)

Если младший бит namei не установлен, это заменяет STACK[-1] на getattr(STACK[-1], co_names[namei>>1]).

Если младший бит namei установлен, то будет предпринята попытка загрузить метод с именем co_names[namei>>1] из объекта STACK[-1]. STACK[-1] будет выгружен. Этот байткод различает два случая: если у STACK[-1] есть метод с правильным именем, байткод выталкивает несвязанный метод и STACK[-1]. STACK[-1] будет использоваться в качестве первого аргумента (self) CALL или CALL_KW при вызове несвязанного метода. В противном случае проталкивается NULL и объект, возвращенный поиском атрибутов.

Изменено в версии 3.12: Если младший бит namei установлен, то NULL или self заталкивается в стек перед атрибутом или несвязанным методом соответственно.

LOAD_SUPER_ATTR(namei)

Этот опкод реализует super() как в нулевой, так и в двухаргументной форме (например, super().method(), super().attr и super(cls, self).method(), super(cls, self).attr).

Он извлекает из стека три значения (от вершины стека вниз):

  • self: первый аргумент текущего метода

  • cls: класс, в котором был определен текущий метод

  • глобальный super

Что касается аргумента, то он работает аналогично LOAD_ATTR, за исключением того, что namei сдвигается влево на 2 бита вместо 1.

Младший бит namei сигнализирует о попытке загрузки метода, как в случае с LOAD_ATTR, что приводит к выталкиванию NULL и загруженного метода. При снятии этого значения в стек заталкивается одно значение.

Второй младший бит namei, если он установлен, означает, что это был двухаргументный вызов super() (если он не установлен, значит, нуль-аргументный).

Added in version 3.12.

COMPARE_OP(opname)

Выполняет булеву операцию. Имя операции можно найти в cmp_op[opname >> 5]. Если пятый младший бит opname установлен (opname & 16), результат должен быть принудительно приведен к bool.

Изменено в версии 3.13: Пятый младший бит oparg теперь указывает на принудительное преобразование в bool.

IS_OP(invert)

Выполняет сравнение is или is not, если invert равно 1.

Added in version 3.9.

CONTAINS_OP(invert)

Выполняет сравнение in или not in, если invert равно 1.

Added in version 3.9.

IMPORT_NAME(namei)

Импортирует модуль co_names[namei]. STACK[-1] и STACK[-2] выгружаются и предоставляют аргументы fromlist и level для __import__(). Объект модуля заталкивается в стек. Текущее пространство имен не затрагивается: для правильного оператора импорта последующая инструкция STORE_FAST изменяет пространство имен.

IMPORT_FROM(namei)

Загружает атрибут co_names[namei] из модуля, найденного в STACK[-1]. Полученный объект помещается в стек, чтобы впоследствии быть сохраненным инструкцией STORE_FAST.

JUMP_FORWARD(delta)

Увеличивает счетчик байткода на дельта.

JUMP_BACKWARD(delta)

Уменьшает счетчик байткода на дельта. Проверяет наличие прерываний.

Added in version 3.11.

JUMP_BACKWARD_NO_INTERRUPT(delta)

Уменьшает счетчик байткода на дельта. Не проверяет наличие прерываний.

Added in version 3.11.

POP_JUMP_IF_TRUE(delta)

Если STACK[-1] равен true, увеличивает счетчик байткода на дельта. STACK[-1] выводится.

Изменено в версии 3.11: Теперь oparg - это относительная дельта, а не абсолютная цель. Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде направленными версиями (вперед/назад).

Изменено в версии 3.12: Это больше не псевдоинструкция.

Изменено в версии 3.13: Теперь эта инструкция требует точного операнда bool.

POP_JUMP_IF_FALSE(delta)

Если STACK[-1] равно false, увеличивает счетчик байткода на дельта. STACK[-1] выводится.

Изменено в версии 3.11: Теперь oparg - это относительная дельта, а не абсолютная цель. Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде направленными версиями (вперед/назад).

Изменено в версии 3.12: Это больше не псевдоинструкция.

Изменено в версии 3.13: Теперь эта инструкция требует точного операнда bool.

POP_JUMP_IF_NOT_NONE(delta)

Если STACK[-1] не является None, увеличивает счетчик байткода на дельта. STACK[-1] выводится на экран.

Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде на направленные версии (вперед/назад).

Added in version 3.11.

Изменено в версии 3.12: Это больше не псевдоинструкция.

POP_JUMP_IF_NONE(delta)

Если STACK[-1] равно None, увеличивает счетчик байткода на дельта. STACK[-1] выводится на экран.

Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде на направленные версии (вперед/назад).

Added in version 3.11.

Изменено в версии 3.12: Это больше не псевдоинструкция.

FOR_ITER(delta)

STACK[-1] является iterator. Вызовите его метод __next__(). Если в результате будет получено новое значение, поместите его в стек (оставив итератор под ним). Если итератор показывает, что он исчерпан, то счетчик байт-кода увеличивается на дельта.

Изменено в версии 3.12: До версии 3.11 итератор разворачивался, когда был исчерпан.

LOAD_GLOBAL(namei)

Загружает в стек глобальное имя co_names[namei>>1].

Изменено в версии 3.11: Если младший бит namei установлен, то перед глобальной переменной в стек заносится NULL.

LOAD_FAST(var_num)

Перемещает ссылку на локальный co_varnames[var_num] в стек.

Изменено в версии 3.12: Этот опкод теперь используется только в ситуациях, когда локальная переменная гарантированно инициализирована. Он не может поднять UnboundLocalError.

LOAD_FAST_CHECK(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек, поднимая сообщение UnboundLocalError, если локальная переменная не была инициализирована.

Added in version 3.12.

LOAD_FAST_AND_CLEAR(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек (или помещает NULL в стек, если локальная переменная не была инициализирована) и устанавливает co_varnames[var_num] в NULL.

Added in version 3.12.

STORE_FAST(var_num)

Записывает STACK.pop() в локальный co_varnames[var_num].

DELETE_FAST(var_num)

Удаляет локальные co_varnames[var_num].

MAKE_CELL(i)

Создает новую ячейку в слоте i. Если этот слот непустой, то значение сохраняется в новой ячейке.

Added in version 3.11.

LOAD_DEREF(i)

Загружает ячейку, содержащуюся в слоте i хранилища «быстрых локалей». Помещает ссылку на объект, содержащийся в ячейке, в стек.

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

LOAD_FROM_DICT_OR_DEREF(i)

Выгружает отображение из стека и ищет в этом отображении имя, связанное со слотом i хранилища «быстрых локалей». Если имя там не найдено, загружает его из ячейки, содержащейся в слоте i, аналогично LOAD_DEREF. Это используется для загрузки свободных переменных в телах классов (которые ранее использовали LOAD_CLASSDEREF) и в annotation scopes внутри тел классов.

Added in version 3.12.

STORE_DEREF(i)

Записывает STACK.pop() в ячейку, содержащуюся в слоте i хранилища «быстрых локалей».

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

DELETE_DEREF(i)

Опустошает ячейку, содержащуюся в слоте i, из хранилища «быстрых локалей». Используется оператором del.

Added in version 3.2.

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

COPY_FREE_VARS(n)

Копирует свободные переменные n из закрытия во фрейм. Устраняет необходимость в специальном коде на стороне вызывающей стороны при вызове закрытий.

Added in version 3.11.

RAISE_VARARGS(argc)

Вызывает исключение, используя одну из 3 форм оператора raise, в зависимости от значения argc:

  • 0: raise (повторное повышение предыдущего исключения)

  • 1: raise STACK[-1] (поднять экземпляр или тип исключения по адресу STACK[-1])

  • 2: raise STACK[-2] from STACK[-1] (поднять экземпляр или тип исключения по адресу STACK[-2] с __cause__, установленным на STACK[-1])

CALL(argc)

Вызывает вызываемый объект с количеством аргументов, указанных argc. В стеке находятся (в порядке возрастания):

  • Вызываемый

  • self или NULL

  • Остальные позиционные аргументы

argc - это сумма позиционных аргументов, исключая self.

CALL выгружает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и вставляет возвращаемое вызываемым объектом значение.

Added in version 3.11.

Изменено в версии 3.13: Теперь вызываемый объект всегда находится в одной и той же позиции на стеке.

Изменено в версии 3.13: Вызовы с аргументами в виде ключевых слов теперь обрабатываются CALL_KW.

CALL_KW(argc)

Вызывает вызываемый объект с количеством аргументов, указанных argc, включая один или несколько именованных аргументов. В стеке находятся (в порядке возрастания):

  • Вызываемый

  • self или NULL

  • Остальные позиционные аргументы

  • Именованные аргументы

  • Список tuple имен аргументов ключевых слов

argc - это сумма позиционных и именованных аргументов, исключая self. Длина кортежа имен аргументов ключевых слов равна количеству именованных аргументов.

CALL_KW выгружает из стека все аргументы, имена ключевых слов и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращенное вызываемым объектом.

Added in version 3.13.

CALL_FUNCTION_EX(flags)

Вызывает вызываемый объект с переменным набором позиционных и ключевых аргументов. Если младший бит flags установлен, то в верхней части стека находится объект отображения, содержащий дополнительные аргументы в виде ключевых слов. Перед вызовом вызываемого объекта объект отображения и объект iterable «распаковываются», а их содержимое передается в качестве ключевых и позиционных аргументов соответственно. CALL_FUNCTION_EX снимает со стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает возвращаемое вызываемым объектом значение.

Added in version 3.6.

PUSH_NULL

Вставляет NULL в стек. Используется в последовательности вызовов для соответствия NULL, выталкиваемому LOAD_METHOD для вызовов, не относящихся к методам.

Added in version 3.11.

MAKE_FUNCTION

Помещает в стек новый объект функции, построенный из объекта кода по адресу STACK[1].

Изменено в версии 3.10: Значение флага 0x04 - кортеж строк вместо словаря

Изменено в версии 3.11: Квалифицированное имя по адресу STACK[-1] было удалено.

Изменено в версии 3.13: Лишние атрибуты функции на стеке, сигнализируемые флагами oparg, были удалены. Теперь они используют SET_FUNCTION_ATTRIBUTE.

SET_FUNCTION_ATTRIBUTE(flag)

Устанавливает атрибут на объект функции. Ожидает функцию по адресу STACK[-1] и значение атрибута для установки по адресу STACK[-2]; потребляет оба значения и оставляет функцию по адресу STACK[-1]. Флаг определяет, какой атрибут установить:

  • 0x01 кортеж значений по умолчанию для параметров «только позиция» и «позиция или ключевое слово» в позиционном порядке

  • 0x02 словарь значений по умолчанию параметров, относящихся только к ключевым словам

  • 0x04 кортеж строк, содержащих аннотации параметров

  • 0x08 кортеж, содержащий ячейки для свободных переменных, образуя замыкание

Added in version 3.13.

BUILD_SLICE(argc)

Помещает объект slice в стек. argc должен быть равен 2 или 3. Если 2, то реализуется:

end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, stop))

если оно равно 3, реализует:

step = STACK.pop()
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end, step))

Дополнительные сведения см. во встроенной функции slice().

EXTENDED_ARG(ext)

Префикс любого опкода, аргумент которого слишком велик, чтобы поместиться в стандартный один байт. ext содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждого опкода допускается не более трех префиксных EXTENDED_ARG, формирующих аргумент от двухбайтового до четырехбайтового.

CONVERT_VALUE(oparg)

Преобразуйте значение в строку, в зависимости от oparg:

value = STACK.pop()
result = func(value)
STACK.append(result)
  • oparg == 1: вызов str() на значение.

  • oparg == 2: вызов repr() на значение.

  • oparg == 3: вызов ascii() на значение.

Используется для реализации форматированных литеральных строк (f-строк).

Added in version 3.13.

FORMAT_SIMPLE

Форматирует значение на вершине стека:

value = STACK.pop()
result = value.__format__("")
STACK.append(result)

Используется для реализации форматированных литеральных строк (f-строк).

Added in version 3.13.

FORMAT_SPEC

Форматирует заданное значение с заданным форматом spec:

spec = STACK.pop()
value = STACK.pop()
result = value.__format__(spec)
STACK.append(result)

Используется для реализации форматированных литеральных строк (f-строк).

Added in version 3.13.

MATCH_CLASS(count)

STACK[-1] - кортеж имен атрибутов ключевого слова, STACK[-2] - класс, с которым производится сопоставление, STACK[-3] - субъект сопоставления. count - количество позиционных подпаттернов.

Вытащите STACK[-1], STACK[-2] и STACK[-3]. Если STACK[-3] является экземпляром STACK[-2] и имеет позиционные и ключевые атрибуты, требуемые count и STACK[-1], вставьте кортеж извлеченных атрибутов. В противном случае вставьте None.

Added in version 3.10.

Изменено в версии 3.11: Ранее эта инструкция также передавала булево значение, указывающее на успех (True) или неудачу (False).

RESUME(context)

Не работает. Выполняет внутреннюю трассировку, отладку и проверку оптимизации.

Опаранд context состоит из двух частей. Младшие два бита указывают, где находится RESUME:

  • 0 Начало функции, которая не является ни генератором, ни coroutine, ни async-генератором

  • 1 После выражения yield

  • 2 После выражения yield from

  • 3 После выражения await

Следующим битом будет 1, если RESUME находится на исключительном шаге 1, и 0 в противном случае.

Added in version 3.11.

Изменено в версии 3.13: Значение oparg изменилось, чтобы включить информацию об исключении глубины

RETURN_GENERATOR

Создает генератор, coroutine или async-генератор из текущего кадра. Используется в качестве первого опкода объекта in code для вышеупомянутых вызываемых элементов. Очистите текущий кадр и верните только что созданный генератор.

Added in version 3.11.

SEND(delta)

Эквивалент STACK[-1] = STACK[-2].send(STACK[-1]). Используется в операторах yield from и await.

Если вызов поднимает StopIteration, извлеките верхнее значение из стека, вставьте атрибут value исключения и увеличьте счетчик байткода на delta.

Added in version 3.11.

HAVE_ARGUMENT

На самом деле это не совсем опкод. Он определяет разделительную линию между опкодами в диапазоне [0,255], которые не используют свой аргумент, и теми, которые используют (< HAVE_ARGUMENT и >= HAVE_ARGUMENT, соответственно).

Если в вашем приложении используются псевдоинструкции или специализированные инструкции, используйте вместо них коллекцию hasarg.

Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды < HAVE_ARGUMENT его игнорируют. Раньше аргумент был только у опкодов >= HAVE_ARGUMENT.

Изменено в версии 3.12: Псевдоинструкции были добавлены в модуль dis, и для них не верно, что сравнение с HAVE_ARGUMENT показывает, используют ли они свой arg.

Не рекомендуется, начиная с версии 3.13: Вместо этого используйте hasarg.

CALL_INTRINSIC_1

Вызывает внутреннюю функцию с одним аргументом. Передает STACK[-1] в качестве аргумента и устанавливает STACK[-1] в результат. Используется для реализации функциональности, не критичной к производительности.

Операнд определяет, какая внутренняя функция будет вызвана:

Операнд

Описание

INTRINSIC_1_INVALID

Недействительно

INTRINSIC_PRINT

Выводит аргумент в стандартный аут. Используется в REPL.

INTRINSIC_IMPORT_STAR

Выполняет import * для именованного модуля.

INTRINSIC_STOPITERATION_ERROR

Извлекает возвращаемое значение из исключения StopIteration.

INTRINSIC_ASYNC_GEN_WRAP

Обертывание значения генератора aync

INTRINSIC_UNARY_POSITIVE

Выполняет унарную операцию +.

INTRINSIC_LIST_TO_TUPLE

Преобразует список в кортеж

INTRINSIC_TYPEVAR

Создает typing.TypeVar

INTRINSIC_PARAMSPEC

Создает typing.ParamSpec

INTRINSIC_TYPEVARTUPLE

Создает typing.TypeVarTuple

INTRINSIC_SUBSCRIPT_GENERIC

Возвращает typing.Generic, подписанный аргументом

INTRINSIC_TYPEALIAS

Создает псевдоним typing.TypeAliasType; используется в операторе type. Аргументом является кортеж из имени псевдонима типа, параметров типа и значения.

Added in version 3.12.

CALL_INTRINSIC_2

Вызывает внутреннюю функцию с двумя аргументами. Используется для реализации функциональности, которая не критична к производительности:

arg2 = STACK.pop()
arg1 = STACK.pop()
result = intrinsic2(arg1, arg2)
STACK.append(result)

Операнд определяет, какая внутренняя функция будет вызвана:

Операнд

Описание

INTRINSIC_2_INVALID

Недействительно

INTRINSIC_PREP_RERAISE_STAR

Вычисляет ExceptionGroup для повышения с try-except*.

INTRINSIC_TYPEVAR_WITH_BOUND

Создает typing.TypeVar с привязкой.

INTRINSIC_TYPEVAR_WITH_CONSTRAINTS

Создает typing.TypeVar с ограничениями.

INTRINSIC_SET_FUNCTION_TYPE_PARAMS

Устанавливает атрибут __type_params__ функции.

Added in version 3.12.

Псевдоинструкции.

Эти опкоды не появляются в байткоде Python. Они используются компилятором, но заменяются настоящими опкодами или удаляются перед генерацией байткода.

SETUP_FINALLY(target)

Создайте обработчик исключений для следующего блока кода. При возникновении исключения уровень стека значений восстанавливается до текущего состояния и управление передается обработчику исключений по адресу target.

SETUP_CLEANUP(target)

Аналогично SETUP_FINALLY, но в случае исключения также заталкивает последнюю инструкцию (lasti) в стек, чтобы RERAISE мог ее восстановить. При возникновении исключения уровень стека значений и последняя инструкция в кадре восстанавливаются в текущее состояние, а управление передается обработчику исключения по адресу target.

SETUP_WITH(target)

Аналогично SETUP_CLEANUP, но в случае исключения из стека вытаскивается еще один элемент, прежде чем управление будет передано обработчику исключения по адресу target.

Этот вариант используется в конструкциях with и async with, которые переносят возвращаемое значение __enter__() или __aenter__() контекстного менеджера в стек.

POP_BLOCK

Отмечает конец блока кода, связанного с последним SETUP_FINALLY, SETUP_CLEANUP или SETUP_WITH.

JUMP
JUMP_NO_INTERRUPT

Инструкции ненаправленного относительного перехода, которые ассемблер заменяет их направленными (вперед/назад) аналогами.

LOAD_CLOSURE(i)

Выталкивает ссылку на ячейку, содержащуюся в слоте i хранилища «быстрых локалей».

Обратите внимание, что в ассемблере LOAD_CLOSURE заменяется на LOAD_FAST.

Изменено в версии 3.13: Теперь этот опкод является псевдоинструкцией.

LOAD_METHOD

Оптимизированный поиск несвязанного метода. Выдается как опкод LOAD_ATTR с установленным флагом в arg.

Коллекции опкодов

Эти коллекции предназначены для автоматической интроспекции инструкций байткода:

Изменено в версии 3.12: Коллекции теперь содержат псевдоинструкции и инструментальные инструкции. Это опкоды со значениями >= MIN_PSEUDO_OPCODE и >= MIN_INSTRUMENTED_OPCODE.

dis.opname

Последовательность имен операций, индексируемых с помощью байткода.

dis.opmap

Словарь, отображающий имена операций на байткоды.

dis.cmp_op

Последовательность имен всех операций сравнения.

dis.hasarg

Последовательность байткодов, использующих свой аргумент.

Added in version 3.12.

dis.hasconst

Последовательность байткодов, обращающихся к константе.

dis.hasfree

Последовательность байткодов, обращающихся к свободной переменной. „Свободная“ в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости или имена во внешних областях видимости, на которые ссылаются из этой области видимости. Он не включает ссылки на глобальные или встроенные области видимости.

dis.hasname

Последовательность байткодов, обращающихся к атрибуту по имени.

dis.hasjump

Последовательность байткодов, имеющих цель перехода. Все переходы являются относительными.

Added in version 3.13.

dis.haslocal

Последовательность байткодов, обращающихся к локальной переменной.

dis.hascompare

Последовательность байткодов булевых операций.

dis.hasexc

Последовательность байткодов, устанавливающих обработчик исключений.

Added in version 3.12.

dis.hasjrel

Последовательность байткодов, имеющих относительную цель перехода.

Не рекомендуется, начиная с версии 3.13: Все переходы теперь относительные. Используйте hasjump.

dis.hasjabs

Последовательность байткодов, имеющих абсолютную цель перехода.

Не рекомендуется, начиная с версии 3.13: Все переходы теперь относительные. Этот список пуст.