Spec-Zone.ru › Python 3.13

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

Исходный код: Lib/dis.py

Модуль dis поддерживает анализ байт-кода CPython путем его дизассемблирования. Байт-код 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

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

Добавлено в версии 3.13.

-O, --show-offsets

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

Добавлено в версии 3.13.

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

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

Добавлено в версии 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 из указанной трассировки стека, устанавливая current_offset на инструкцию, вызвавшую исключение.

codeobj

Скомпилированный объект кода.

first_line

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

dis()

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

info()

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

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

Изменено в версии 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.

Добавлено в версии 3.2.

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

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

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

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

Добавлено в версии 3.2.

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

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

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

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

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

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

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

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

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

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

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

dis.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, оно указывает номер строки, который следует указать для первой строки исходного кода в дизассемблированном коде. В противном случае сведения об исходных строках (если они есть) берутся непосредственно из дизассемблированного объекта кода.

Параметр adaptive работает так же, как в dis().

Добавлено в версии 3.4.

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

Изменено в версии 3.13: Параметр show_caches объявлен устаревшим и не оказывает никакого эффекта. Итератор создает экземпляры Instruction с заполненным полем cache_info (независимо от значения show_caches) и больше не создает отдельные элементы для записей кэша.

dis.findlinestarts(code)

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

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

Изменено в версии 3.10: Вместо атрибутов co_firstlineno и co_lnotab объекта кода используется метод co_lines(), введенный в PEP 626.

Изменено в версии 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 (значение по умолчанию), будет возвращен максимальный эффект на стек для обоих случаев.

Добавлено в версии 3.4.

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

Изменено в версии 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

разрешённое значение аргумента (если есть), в противном случае 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, содержащий начальные и конечные позиции, охватываемые этой инструкцией.

cache_info

Сведения о записях кэша этой инструкции в виде троек формата (name, size, data), где name и size описывают формат кэша, а данные — его содержимое. cache_info равно None, если у инструкции нет кэша.

Добавлено в версии 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

Добавлено в версии 3.11.

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

Общие инструкции

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

NOP

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

POP_TOP

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

STACK.pop()
END_FOR

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

Добавлено в версии 3.12.

END_SEND

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

Добавлено в версии 3.12.

COPY(i)

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

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

Добавлено в версии 3.11.

SWAP(i)

Меняет местами верхний элемент стека и i-й элемент:

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

Добавлено в версии 3.11.

CACHE

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

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

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

Добавлено в версии 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] является объектом итератора-генератора или сопрограммы, он остаётся без изменений. В противном случае реализует STACK[-1] = iter(STACK[-1]).

Добавлено в версии 3.5.

TO_BOOL

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

Добавлено в версии 3.13.

Бинарные операции и операции на месте

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

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

BINARY_OP(op)

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

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

Добавлено в версии 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])

Добавлено в версии 3.12.

STORE_SLICE

Реализует:

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

Добавлено в версии 3.12.

Коды операций сопрограмм

GET_AWAITABLE(where)

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

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

  • 1: после вызова __aenter__
  • 2: после вызова __aexit__

Добавлено в версии 3.5.

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

GET_AITER

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

Добавлено в версии 3.5.

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

GET_ANEXT

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

Добавлено в версии 3.5.

END_ASYNC_FOR

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

Добавлено в версии 3.8.

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

CLEANUP_THROW

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

Добавлено в версии 3.12.

BEFORE_ASYNC_WITH

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

STACK.extend((__aexit__, __aenter__())

Добавлено в версии 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)

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

Добавлено в версии 3.1.

Изменено в версии 3.8: Значение отображения находится в STACK[-1], а ключ отображения — в STACK[-2]. Ранее они располагались наоборот.

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

RETURN_VALUE

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

RETURN_CONST(consti)

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

Добавлено в версии 3.12.

YIELD_VALUE

Выдаёт STACK.pop() из генератора.

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

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

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

SETUP_ANNOTATIONS

Проверяет, определено ли __annotations__ в locals(); если нет, оно инициализируется пустым dict. Этот код операции генерируется только в том случае, если тело класса или модуля статически содержит аннотации переменных.

Добавлено в версии 3.6.

POP_EXCEPT

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

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

RERAISE

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

Добавлено в версии 3.9.

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

PUSH_EXC_INFO

Удаляет значение из стека. Помещает текущее исключение на вершину стека. Возвращает ранее удалённое значение в стек. Используется в обработчиках исключений.

Добавлено в версии 3.11.

CHECK_EXC_MATCH

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

Добавлено в версии 3.11.

CHECK_EG_MATCH

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

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

Добавлено в версии 3.11.

WITH_EXCEPT_START

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

Добавлено в версии 3.9.

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

LOAD_ASSERTION_ERROR

Помещает AssertionError в стек. Используется оператором assert.

Добавлено в версии 3.9.

LOAD_BUILD_CLASS

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

BEFORE_WITH

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

Добавлено в версии 3.11.

GET_LEN

Выполняет STACK.append(len(STACK[-1])). Используется в операторах match, где требуется сравнение со структурой шаблона.

Добавлено в версии 3.10.

MATCH_MAPPING

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

Добавлено в версии 3.10.

MATCH_SEQUENCE

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

Добавлено в версии 3.10.

MATCH_KEYS

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

Добавлено в версии 3.10.

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

STORE_NAME(namei)

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

DELETE_NAME(namei)

Реализует del name, где namei — индекс в атрибуте co_names объекта кода.

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 объекта кода.

DELETE_ATTR(namei)

Реализует:

obj = STACK.pop()
del obj.name

где namei — индекс имени в co_names объекта кода.

STORE_GLOBAL(namei)

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

DELETE_GLOBAL(namei)

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

LOAD_CONST(consti)

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

LOAD_NAME(namei)

Помещает в стек значение, связанное с co_names[namei]. Поиск имени выполняется сначала в локальных переменных, затем в глобальных и после этого во встроенных.

LOAD_LOCALS

Помещает в стек ссылку на словарь локальных переменных. Используется для подготовки словарей пространства имён для LOAD_FROM_DICT_OR_DEREF и LOAD_FROM_DICT_OR_GLOBALS.

Добавлено в версии 3.12.

LOAD_FROM_DICT_OR_GLOBALS(i)

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

Добавлено в версии 3.12.

BUILD_TUPLE(count)

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

if count == 0:
    value = ()
else:
    value = tuple(STACK[-count:])
    STACK = STACK[:-count]

STACK.append(value)
BUILD_LIST(count)

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

BUILD_SET(count)

Работает как BUILD_TUPLE, но создаёт множество.

BUILD_MAP(count)

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

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

BUILD_CONST_KEY_MAP(count)

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

Добавлено в версии 3.6.

BUILD_STRING(count)

Объединяет count строк из стека и помещает полученную строку в стек.

Добавлено в версии 3.6.

LIST_EXTEND(i)

Реализует:

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

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

Добавлено в версии 3.9.

SET_UPDATE(i)

Реализует:

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

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

Добавлено в версии 3.9.

DICT_UPDATE(i)

Реализует:

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

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

Добавлено в версии 3.9.

DICT_MERGE(i)

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

Добавлено в версии 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() был выполнен с двумя аргументами (если бит не установлен — с нулём аргументов).

Добавлено в версии 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.

Добавлено в версии 3.9.

CONTAINS_OP(invert)

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

Добавлено в версии 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)

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

JUMP_BACKWARD(delta)

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

Добавлено в версии 3.11.

JUMP_BACKWARD_NO_INTERRUPT(delta)

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

Добавлено в версии 3.11.

POP_JUMP_IF_TRUE(delta)

Если STACK[-1] истинно, увеличивает счётчик байт-кода на delta. STACK[-1] извлекается из стека.

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

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

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

POP_JUMP_IF_FALSE(delta)

Если STACK[-1] ложно, увеличивает счётчик байт-кода на delta. STACK[-1] извлекается из стека.

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

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

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

POP_JUMP_IF_NOT_NONE(delta)

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

Добавлено в версии 3.11.

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

POP_JUMP_IF_NONE(delta)

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

Добавлено в версии 3.11.

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

FOR_ITER(delta)

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

Изменено в версии 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_LOAD_FAST(var_nums)

Помещает в стек ссылки на co_varnames[var_nums >> 4] и co_varnames[var_nums & 15].

Добавлено в версии 3.13.

LOAD_FAST_CHECK(var_num)

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

Добавлено в версии 3.12.

LOAD_FAST_AND_CLEAR(var_num)

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

Добавлено в версии 3.12.

STORE_FAST(var_num)

Сохраняет STACK.pop() в локальную переменную co_varnames[var_num].

STORE_FAST_STORE_FAST(var_nums)

Сохраняет STACK[-1] в co_varnames[var_nums >> 4], а STACK[-2] — в co_varnames[var_nums & 15].

Добавлено в версии 3.13.

STORE_FAST_LOAD_FAST(var_nums)

Сохраняет STACK.pop() в локальную переменную co_varnames[var_nums >> 4] и помещает в стек ссылку на локальную переменную co_varnames[var_nums & 15].

Добавлено в версии 3.13.

DELETE_FAST(var_num)

Удаляет локальную переменную co_varnames[var_num].

MAKE_CELL(i)

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

Добавлено в версии 3.11.

LOAD_DEREF(i)

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

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

LOAD_FROM_DICT_OR_DEREF(i)

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

Добавлено в версии 3.12.

STORE_DEREF(i)

Сохраняет STACK.pop() в ячейку из слота i хранилища «быстрых локальных переменных».

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

DELETE_DEREF(i)

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

Добавлено в версии 3.2.

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

COPY_FREE_VARS(n)

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

Добавлено в версии 3.11.

RAISE_VARARGS(argc)

Вызывает исключение одним из трёх способов, предусмотренных инструкцией 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 извлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращённое им значение.

Добавлено в версии 3.11.

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

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

CALL_KW(argc)

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

  • Вызываемый объект
  • self или NULL
  • Остальные позиционные аргументы
  • Именованные аргументы
  • tuple с именами именованных аргументов

argc — это общее количество позиционных и именованных аргументов без учёта self. Длина кортежа с именами именованных аргументов равна числу именованных аргументов.

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

Добавлено в версии 3.13.

CALL_FUNCTION_EX(flags)

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

Добавлено в версии 3.6.

PUSH_NULL

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

Добавлено в версии 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 — кортеж с ячейками для свободных переменных, образующими замыкание

Добавлено в версии 3.13.

BUILD_SLICE(argc)

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

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

если он равен 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() для value
  • oparg == 2: вызывает repr() для value
  • oparg == 3: вызывает ascii() для value

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

Добавлено в версии 3.13.

FORMAT_SIMPLE

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

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

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

Добавлено в версии 3.13.

FORMAT_WITH_SPEC

Форматирует заданное значение с помощью заданной спецификации формата:

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

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

Добавлено в версии 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.

Добавлено в версии 3.10.

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

RESUME(context)

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

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

  • 0 В начале функции, которая не является генератором, сопрограммой или асинхронным генератором
  • 1 После выражения yield
  • 2 После выражения yield from
  • 3 После выражения await

Следующий бит равен 1, если RESUME выполняется на уровне вложенности исключений 1, и 0 в противном случае.

Добавлено в версии 3.11.

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

RETURN_GENERATOR

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

Добавлено в версии 3.11.

SEND(delta)

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

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

Добавлено в версии 3.11.

HAVE_ARGUMENT

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

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

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

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

Устарело с версии 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

Оборачивает значение асинхронного генератора

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. Аргумент — это кортеж из имени псевдонима типа, параметров типа и значения.

Добавлено в версии 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__ функции.

Добавлено в версии 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 с установленным флагом в аргументе.

Коллекции инструкций

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

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

dis.opname

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

dis.opmap

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

dis.cmp_op

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

dis.hasarg

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

Добавлено в версии 3.12.

dis.hasconst

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

dis.hasfree

Последовательность байт-кодов, обращающихся к свободной переменной (переменной замыкания). В данном контексте «свободными» называются имена в текущей области видимости, на которые ссылаются внутренние области, или имена во внешних областях, на которые ссылается эта область. Сюда не входят ссылки на глобальную или встроенную области видимости.

dis.hasname

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

dis.hasjump

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

Добавлено в версии 3.13.

dis.haslocal

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

dis.hascompare

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

dis.hasexc

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

Добавлено в версии 3.12.

dis.hasjrel

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

Устарело с версии 3.13: Теперь все переходы относительные. Используйте hasjump.

dis.hasjabs

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

Устарело с версии 3.13: Теперь все переходы относительные. Этот список пуст.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/dis.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API