Spec-Zone.ru › Python 3.14

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.

Изменено в версии 3.14: Добавлены параметр командной строки -P и аргумент show_positions.

Добавлен параметр командной строки -S.

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

def myfunc(alist):
    return len(alist)

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

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

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

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

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

Модуль dis можно запустить как скрипт из командной строки:

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

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

-h, --help

Показать справку по использованию и завершить работу.

-C, --show-caches

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

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

-O, --show-offsets

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

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

-P, --show-positions

Показать позиции инструкций в исходном коде.

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

-S, --specialized

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

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

Если указан 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, show_positions=False)

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

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

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

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

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

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

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

Если show_positions равно 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.

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

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

Пример:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
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, show_offsets=False, show_positions=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.

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

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

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

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

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

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

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

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

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

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

Дизассемблирует объект кода, отмечая последнюю инструкцию, если задан lasti. Вывод разделён на следующие столбцы:

  1. местоположение инструкции в исходном коде. Если show_positions равно true, отображается полная информация о местоположении. В противном случае (по умолчанию) выводится только номер строки.
  2. текущая инструкция, обозначенная как -->,
  3. инструкция с меткой, обозначенная как >>,
  4. адрес инструкции,
  5. имя кода операции,
  6. параметры операции и
  7. интерпретация параметров в скобках.

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

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

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

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

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

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

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 описывают формат кэша, а data — его содержимое. 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

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

NOT_TAKEN

Инструкция, не выполняющая никаких действий. Используется интерпретатором для регистрации событий BRANCH_LEFT и BRANCH_RIGHT для sys.monitoring.

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

POP_ITER

Удаляет итератор с вершины стека.

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

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.

Изменено в версии 3.14: При oparg :NB_SUBSCR реализует бинарный доступ по индексу (заменяет код операции BINARY_SUBSCR)

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()
value = 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.

Разные коды операций

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] вызывающему коду функции.

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_COMMON_CONSTANT

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

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

LOAD_BUILD_CLASS

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

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_SMALL_INT(i)

Помещает целое число i в стек. i должно находиться в range(256)

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

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_TEMPLATE

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

interpolations = STACK.pop()
strings = STACK.pop()
STACK.append(_build_template(strings, interpolations))

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

BUILD_INTERPOLATION(format)

Создаёт новый экземпляр Interpolation из значения и его исходного выражения и помещает полученный объект в стек.

Если преобразование или спецификация формата отсутствуют, format устанавливается в 2.

Если установлен младший бит format, это означает, что интерполяция содержит спецификацию формата.

Если format >> 2 не равно нулю, это означает, что интерполяция содержит преобразование. Значение format >> 2 — это тип преобразования (0 для отсутствия преобразования, 1 для !s, 2 для !r и 3 для !a):

conversion = format >> 2
if format & 1:
    format_spec = STACK.pop()
else:
    format_spec = None
expression = STACK.pop()
value = STACK.pop()
STACK.append(_build_interpolation(value, expression, conversion, format_spec))

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

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_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]. При вызове несвязанного метода инструкция CALL или CALL_KW использует STACK[-1] в качестве первого аргумента (self). В противном случае в стек помещаются 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: Пятый бит снизу аргумента опкода теперь указывает на принудительное преобразование к 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: Аргумент опкода теперь задаёт относительное смещение, а не абсолютную цель перехода. Этот опкод является псевдоинструкцией, которая в итоговом байткоде заменяется направленными версиями (вперёд/назад).

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

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

POP_JUMP_IF_FALSE(delta)

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

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

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

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

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

LOAD_FAST_LOAD_FAST(var_nums)

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

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

LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)

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

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

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

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

Изменено в версии 3.14: Добавлено 0x10 для указания функции аннотирования объекта функции.

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.

LOAD_SPECIAL

Выполняет поиск специального метода в STACK[-1]. Если type(STACK[-1]).__xxx__ является методом, оставляет type(STACK[-1]).__xxx__; STACK[-1] в стеке. Если type(STACK[-1]).__xxx__ не является методом, оставляет STACK[-1].__xxx__; NULL в стеке.

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

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

Эти инструкции не встречаются в байт-коде 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.

LOAD_CONST_IMMORTAL(consti)

Работает как LOAD_CONST, но эффективнее для бессмертных объектов.

JUMP
JUMP_NO_INTERRUPT

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

JUMP_IF_TRUE
JUMP_IF_FALSE

Условные переходы, не влияющие на стек. Заменяются последовательностью COPY 1, TO_BOOL, POP_JUMP_IF_TRUE/FALSE.

LOAD_CLOSURE(i)

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

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

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

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

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

Изменено в версии 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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/dis.html

Spec-Zone.ru

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