Содержание страницы
dis – Дизассемблер байт-кода Python¶dis – Disassembler for Python bytecode
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байт-кода CPython путём
eго дизассемблирования. Байт-код 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_BORROW 0 (alist)
CALL 1
RETURN_VALUE
(«2» – это номер строки).
Интерфейс командной строки¶Command-line interface
Модуль 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.
Анализ байт-кода¶Bytecode analysis
Добавлено в версии 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()будет отображать записи inline-кэша, используемые интерпретатором для специализации байткода.Если adaptive равно
True,dis()будет отображать специализированный байткод, который может отличаться от исходного.Если show_offsets равно
True,dis()будет включать смещения инструкций в вывод.Если show_positions равно
True,dis()будет включать позиции инструкций в исходном коде в вывод.- classmethod from_traceback(tb, *, show_caches=False)¶
Создаёт экземпляр
Bytecodeиз заданного traceback, устанавливая 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
Функции анализа¶Analysis functions
Модуль 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()перед дисассемблированием. Если объект не указан, эта функция дисассемблирует последний traceback.Результат дисассемблирования выводится в виде текста в указанный аргумент 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)¶
Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.
Результат дисассемблирования выводится в виде текста в указанный аргумент 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. Результат разбит на следующие столбцы:
местоположение инструкции в исходном коде. Полная информация о местоположении отображается, если show_positions равен true. В противном случае (по умолчанию) отображается только номер строки.
текущая инструкция, помечена как
-->,инструкция с меткой, помечена
>>,адрес инструкции,
название кода операции,
параметры операции и
интерпретация параметров в скобках.
Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.
Результат дисассемблирования выводится в виде текста в указанный аргумент 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: Метод PEP 626
co_lines()используется вместо атрибутовco_firstlinenoиco_lnotabобъекта кода.Изменено в версии 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¶Python Bytecode Instructions
Функция get_instructions() и класс Bytecode предоставляют сведения об инструкциях байткода в виде экземпляров Instruction:
- class dis.Instruction¶
Подробности об операции байткода
- opcode¶
Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в коллекциях Opcode.
- opname¶
Человекочитаемое имя операции
- baseopname¶
человекочитаемое имя базовой операции, если операция специализирована; иначе равно
opname
- arg¶
числовой аргумент операции (если есть), иначе
None
- 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.12.
В настоящее время компилятор 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.12.
- SWAP(i)¶
Меняет местами вершину стека и i-й элемент:
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
Добавлено в версии 3.12.
- CACHE¶
Вместо того чтобы быть реальной инструкцией, этот опкод используется для разметки дополнительного пространства, чтобы интерпретатор мог кэшировать полезные данные непосредственно в байткоде. Он автоматически скрывается всеми утилитами
dis, но может быть просмотрен с помощьюshow_caches=True.Логически это пространство является частью предыдущей инструкции. Многие опкоды ожидают, что за ними следует точное количество кэшей, и будут указывать интерпретатору пропускать их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует проявлять большую осторожность при чтении или изменении сырого адаптивного байткода, содержащего ускоренные данные.
Добавлено в версии 3.12.
Унарные операции
Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.
- 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.12.
Изменено в версии 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.12.
- CHECK_EXC_MATCH¶
Выполняет сопоставление исключений для
except. Проверяет, является лиSTACK[-2]исключением, соответствующимSTACK[-1]. ИзвлекаетSTACK[-1]и помещает в стек логический результат проверки.Добавлено в версии 3.12.
- CHECK_EG_MATCH¶
Выполняет сопоставление исключений для
except*. Применяетsplit(STACK[-1])к gруппе исключений, представляющейSTACK[-2].В случае совпадения извлекает из стека два элемента и помещает несовпадающую подгруппу (
Noneпри полном совпадении), а затем совпадающую подгруппу. При отсутствии совпадения извлекает один элемент (тип сопоставления) и помещаетNone.Добавлено в версии 3.12.
- 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(или, более технически: если у него установлен флагPy_TPFLAGS_MAPPINGв егоtp_flags), поместитьTrueв стек. В противном случае поместитьFalse.Добавлено в версии 3.10.
- MATCH_SEQUENCE¶
Если
STACK[-1]является экземпляромcollections.abc.Sequenceи не является экземпляромstr/bytes/bytearray(или, более технически: если у него установлен флагPy_TPFLAGS_SEQUENCEв егоtp_flags), поместить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 – это индекс имени в атрибуте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], в стек. Имя ищется в locals, затем в globals, затем в builtins.
- LOAD_LOCALS¶
Помещает ссылку на словарь locals в стек. Это используется для подготовки словарей пространств имён для
LOAD_FROM_DICT_OR_DEREFиLOAD_FROM_DICT_OR_GLOBALS.Добавлено в версии 3.12.
- LOAD_FROM_DICT_OR_GLOBALS(i)¶
Извлекает отображение из стека и ищет значение для
co_names[namei]. Если имя не найдено там, ищет его в globals, затем в builtins, аналогично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].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__(). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректного оператора import последующая инструкцияSTORE_FASTизменяет пространство имён.
- IMPORT_FROM(namei)¶
Загружает атрибут
co_names[namei]из модуля, находящегося вSTACK[-1]. Полученный объект помещается в стек для последующего сохранения инструкциейSTORE_FAST.
- JUMP_FORWARD(delta)¶
Увеличивает счётчик байт-кода на delta.
- JUMP_BACKWARD(delta)¶
Уменьшает счётчик байт-кода на delta. Проверяет прерывания.
Добавлено в версии 3.12.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
Уменьшает счётчик байт-кода на delta. Не проверяет прерывания.
Добавлено в версии 3.12.
- 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.12.
Изменено в версии 3.12: Эта инструкция больше не является псевдо-инструкцией.
- POP_JUMP_IF_NONE(delta)¶
Если
STACK[-1]равноNone, увеличивает счётчик байткода на delta.STACK[-1]извлекается из стека.Добавлено в версии 3.12.
Изменено в версии 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.12.
- 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.12.
- 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.12.
Изменено в версии 3.13: Вызываемый объект теперь всегда находится на одной и той же позиции в стеке.
Изменено в версии 3.13: Вызовы с именованными аргументами теперь обрабатываются
CALL_KW.
- CALL_KW(argc)¶
Вызывает вызываемый объект с количеством аргументов, указанным
argc, включая один или несколько именованных аргументов. В стеке находятся (в порядке возрастания):Вызываемый объект
selfилиNULLОставшиеся позиционные аргументы
Именованные аргументы
tupleимён именованных аргументов
argc– это общее количество позиционных и именованных аргументов, исключаяself. Длина кортежа имён именованных аргументов равна количеству именованных аргументов.CALL_KWизвлекает из стека все аргументы, имена ключевых слов и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.Добавлено в версии 3.13.
- CALL_FUNCTION_EX(flags)¶
Вызывает вызываемый объект с набором позиционных и именованных аргументов переменной длины. Если установлен младший бит flags, на вершине стека находится отображающий объект (mapping), содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта отображающий объект и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно.
CALL_FUNCTION_EXизвлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.Добавлено в версии 3.6.
- PUSH_NULL¶
Помещает
NULLв стек. Используется в последовательности вызова для сопоставления сNULL, помещённымLOAD_METHODдля вызовов не-методов.Добавлено в версии 3.12.
- 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функция annotate для объекта функции
Добавлено в версии 3.13.
Изменено в версии 3.14: Добавлен
0x10для указания функции annotate для объекта функции.
- 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()для значенияoparg == 2: вызовrepr()для значенияoparg == 3: вызовascii()для значения
Используется для реализации форматированных строковых литералов (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После выраженияyield2После выраженияyield from3После выраженияawait
Следующий бит равен
1, если RESUME находится на глубине исключения1, и0в противном случае.Добавлено в версии 3.12.
Изменено в версии 3.13: Значение oparg было изменено, чтобы включать информацию о глубине исключения
- RETURN_GENERATOR¶
Создает генератор, корутину или асинхронный генератор из текущего фрейма. Используется как первая опкода в объекте кода для указанных вызываемых объектов. Очищает текущий фрейм и возвращает вновь созданный генератор.
Добавлено в версии 3.12.
- SEND(delta)¶
Эквивалентно
STACK[-1] = STACK[-2].send(STACK[-1]). Используется в операторахyield fromиawait.Если вызов вызывает исключение
StopIteration, извлечь верхнее значение из стека, поместить атрибутvalueисключения и увеличить счетчик байт-кода на delta.Добавлено в версии 3.12.
- 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.TypeVarINTRINSIC_PARAMSPECСоздаёт
typing.ParamSpecINTRINSIC_TYPEVARTUPLEСоздаёт
typing.TypeVarTupleINTRINSIC_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: Теперь этот опкод является псевдоинструкцией.
Коллекции опкодов¶Opcode collections
Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:
Изменено в версии 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¶
Последовательность байткодов, имеющих относительную цель перехода.
Deprecated since version 3.13: All jumps are now relative. Use
hasjump.
- dis.hasjabs¶
Последовательность байткодов, имеющих абсолютную цель перехода.
Устарело с версии 3.13: Все переходы теперь относительные. Этот список пуст.