dis
— Дизассемблер для байткода Python¶
Исходный код: Lib/dis.py.
Модуль dis
поддерживает анализ CPython bytecode путем его дизассемблирования. Байткод CPython, который этот модуль принимает на вход, определен в файле Include/opcode.h
и используется компилятором и интерпретатором.
CPython implementation detail: Байткод - это деталь реализации интерпретатора CPython. Нет никаких гарантий, что байткод не будет добавлен, удален или изменен между версиями Python. Использование этого модуля не должно рассматриваться как работа на разных виртуальных машинах Python или выпусках Python.
Изменено в версии 3.6: Используйте 2 байта для каждой инструкции. Ранее количество байтов варьировалось в зависимости от инструкции.
Пример: Дана функция myfunc()
:
def myfunc(alist):
return len(alist)
следующая команда может быть использована для отображения разборки myfunc()
:
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_FAST 0 (alist)
4 CALL_FUNCTION 1
6 RETURN_VALUE
(«2» - это номер строки).
Анализ байткода¶
Добавлено в версии 3.4.
API анализа байткода позволяет обернуть фрагменты кода Python в объект Bytecode
, который обеспечивает легкий доступ к деталям скомпилированного кода.
-
class
dis.
Bytecode
(x, *, first_line=None, current_offset=None)¶ Анализирует байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращено командой
compile()
).Это удобная обертка вокруг многих функций, перечисленных ниже, особенно
get_instructions()
, поскольку итерация по экземпляруBytecode
дает операции в байткоде как экземплярыInstruction
.Если first_line не является
None
, он указывает номер строки, который должен быть сообщен для первой исходной строки в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.Если current_offset не является
None
, то он ссылается на смещение инструкции в дизассемблированном коде. Установка этого значения означает, чтоdis()
будет отображать маркер «текущая инструкция» напротив указанного опкода.-
classmethod
from_traceback
(tb)¶ Создайте экземпляр
Bytecode
из данного трассировочного отката, установив current_offset на инструкцию, ответственную за исключение.
-
codeobj
¶ Объект скомпилированного кода.
-
first_line
¶ Первая исходная строка объекта кода (если доступна)
-
dis
()¶ Возвращает форматированное представление операций байткода (то же самое, что выводится
dis.dis()
, но возвращается в виде многострочной строки).
-
info
()¶ Возвращает отформатированную многострочную строку с подробной информацией об объекте кода, например
code_info()
.
Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.
-
classmethod
Пример:
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
RETURN_VALUE
Функции анализа¶
Модуль dis
также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемые выходные. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный объект анализа не нужен:
-
dis.
code_info
(x)¶ Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для предоставленной функции, генератора, асинхронного генератора, coroutine, метода, строки исходного кода или объекта кода.
Обратите внимание, что точное содержимое информационных строк кода сильно зависит от реализации и может произвольно меняться в разных виртуальных машинах Python или выпусках Python.
Добавлено в версии 3.2.
Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.
-
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)¶ Разберите объект x. x может обозначать модуль, класс, метод, функцию, генератор, асинхронный генератор, корутину, объект кода, строку исходного кода или последовательность байт необработанного байткода. Для модуля дизассемблируются все функции. Для класса дизассемблируются все методы (включая методы класса и статические методы). Для объекта кода или последовательности необработанного байткода выводится одна строка на каждую инструкцию байткода. Он также рекурсивно разбирает вложенные объекты кода (код пониманий, генераторов выражений и вложенных функций, а также код, используемый для построения вложенных классов). Перед дизассемблированием строки сначала компилируются в объекты кода с помощью встроенной функции
compile()
. Если объект не предоставлен, эта функция дизассемблирует последний отслеженный объект.Разборка записывается в виде текста в указанный аргумент file, если он указан, и в
sys.stdout
в противном случае.Максимальная глубина рекурсии ограничена depth, если только она не равна
None
.depth=0
означает отсутствие рекурсии.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.7: Реализована рекурсивная разборка и добавлен параметр depth.
Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.
-
dis.
distb
(tb=None, *, file=None)¶ Разобрать функцию, находящуюся в верхней части стека, используя последний трассировочный откат, если он не был передан. Указывается инструкция, вызвавшая исключение.
Разборка записывается в виде текста в указанный аргумент file, если он указан, и в
sys.stdout
в противном случае.Изменено в версии 3.4: Добавлен параметр file.
-
dis.
disassemble
(code, lasti=- 1, *, file=None)¶ -
dis.
disco
(code, lasti=- 1, *, file=None)¶ Разобрать объект кода, указав последнюю инструкцию, если было указано lasti. Вывод разделен на следующие колонки:
номер строки, для первой инструкции каждой строки
текущая инструкция, обозначенная как
-->
,маркированная инструкция, обозначенная
>>
,адрес инструкции,
кодовое имя операции,
параметры работы, и
интерпретация параметров в скобках.
Интерпретация параметров распознает имена локальных и глобальных переменных, значения констант, цели ветвления и операторы сравнения.
Разборка записывается в виде текста в указанный аргумент file, если он указан, и в
sys.stdout
в противном случае.Изменено в версии 3.4: Добавлен параметр file.
-
dis.
get_instructions
(x, *, first_line=None)¶ Возвращает итератор по инструкциям в предоставленной функции, методе, строке исходного кода или объекте кода.
Итератор генерирует серию именованных кортежей
Instruction
, содержащих детали каждой операции в предоставленном коде.Если first_line не является
None
, он указывает номер строки, который должен быть сообщен для первой исходной строки в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.Добавлено в версии 3.4.
-
dis.
findlinestarts
(code)¶ Эта функция генератора использует метод
co_lines
объекта кода code для нахождения смещений, которые являются началами строк в исходном коде. Они генерируются в виде пар(offset, lineno)
.Изменено в версии 3.6: Номера линий могут уменьшаться. Раньше они всегда увеличивались.
Изменено в версии 3.10: Метод PEP 626
co_lines
используется вместо атрибутовco_firstlineno
иco_lnotab
объекта кода.
-
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: Добавлен параметр прыжок.
Инструкции байткода Python¶
Функция get_instructions()
и класс Bytecode
предоставляют детали инструкций байткода в виде экземпляров Instruction
:
-
class
dis.
Instruction
¶ Детали для операции байткода
-
opcode
¶ числовой код операции, соответствующий значениям опкода, перечисленным ниже, и значениям байткода в Коллекции опкодов.
-
opname
¶ человекочитаемое имя для операции
-
arg
¶ числовой аргумент операции (если есть), иначе
None
-
argval
¶ разрешенное значение arg (если известно), в противном случае то же, что и arg
-
argrepr
¶ человекочитаемое описание аргумента операции
-
offset
¶ начальный индекс операции в последовательности байткода
-
starts_line
¶ строка, начатая данным опкодом (если таковой имеется), иначе
None
.
-
is_jump_target
¶ True
если другой код переходит сюда, иначеFalse
Добавлено в версии 3.4.
-
В настоящее время компилятор Python генерирует следующие инструкции байткода.
Общие указания
-
NOP
¶ Код «ничего не делать». Используется в качестве заполнителя оптимизатором айтекода.
-
POP_TOP
¶ Удаляет элемент, находящийся в верхней части стека (TOS).
-
ROT_TWO
¶ Поменяйте местами два крайних верхних элемента стека.
-
ROT_THREE
¶ Поднимает второй и третий элементы штабеля на одну позицию вверх, перемещает верхнюю часть вниз на третью позицию.
-
ROT_FOUR
¶ Поднимает второй, третий и четвертый элементы штабеля на одну позицию вверх, перемещает верхнюю часть вниз на четвертую позицию.
Добавлено в версии 3.8.
-
DUP_TOP
¶ Дублирует ссылку на вершине стека.
Добавлено в версии 3.2.
-
DUP_TOP_TWO
¶ Дублирует две ссылки на вершине стека, оставляя их в том же порядке.
Добавлено в версии 3.2.
Унарные операции
Унарные операции берут вершину стека, применяют операцию и заталкивают результат обратно в стек.
-
UNARY_POSITIVE
¶ Реализует
TOS = +TOS
.
-
UNARY_NEGATIVE
¶ Реализует
TOS = -TOS
.
-
UNARY_NOT
¶ Реализует
TOS = not TOS
.
-
UNARY_INVERT
¶ Реализует
TOS = ~TOS
.
-
GET_ITER
¶ Реализует
TOS = iter(TOS)
.
-
GET_YIELD_FROM_ITER
¶ Если
TOS
является объектом generator iterator или coroutine, то он оставляется как есть. В противном случае реализуетсяTOS = iter(TOS)
.Добавлено в версии 3.5.
Двоичные операции
Бинарные операции удаляют вершину стека (TOS) и второй сверху элемент стека (TOS1) из стека. Они выполняют операцию и помещают результат обратно в стек.
-
BINARY_POWER
¶ Реализует
TOS = TOS1 ** TOS
.
-
BINARY_MULTIPLY
¶ Реализует
TOS = TOS1 * TOS
.
-
BINARY_MATRIX_MULTIPLY
¶ Реализует
TOS = TOS1 @ TOS
.Добавлено в версии 3.5.
-
BINARY_FLOOR_DIVIDE
¶ Реализует
TOS = TOS1 // TOS
.
-
BINARY_TRUE_DIVIDE
¶ Реализует
TOS = TOS1 / TOS
.
-
BINARY_MODULO
¶ Реализует
TOS = TOS1 % TOS
.
-
BINARY_ADD
¶ Реализует
TOS = TOS1 + TOS
.
-
BINARY_SUBTRACT
¶ Реализует
TOS = TOS1 - TOS
.
-
BINARY_SUBSCR
¶ Реализует
TOS = TOS1[TOS]
.
-
BINARY_LSHIFT
¶ Реализует
TOS = TOS1 << TOS
.
-
BINARY_RSHIFT
¶ Реализует
TOS = TOS1 >> TOS
.
-
BINARY_AND
¶ Реализует
TOS = TOS1 & TOS
.
-
BINARY_XOR
¶ Реализует
TOS = TOS1 ^ TOS
.
-
BINARY_OR
¶ Реализует
TOS = TOS1 | TOS
.
Операции на месте
Операции in-place похожи на бинарные операции, поскольку они удаляют TOS и TOS1 и заталкивают результат обратно в стек, но операция выполняется in-place, когда TOS1 поддерживает ее, и результирующий TOS может быть (но не обязательно должен быть) исходным TOS1.
-
INPLACE_POWER
¶ Реализует in-place
TOS = TOS1 ** TOS
.
-
INPLACE_MULTIPLY
¶ Реализует in-place
TOS = TOS1 * TOS
.
-
INPLACE_MATRIX_MULTIPLY
¶ Реализует in-place
TOS = TOS1 @ TOS
.Добавлено в версии 3.5.
-
INPLACE_FLOOR_DIVIDE
¶ Реализует in-place
TOS = TOS1 // TOS
.
-
INPLACE_TRUE_DIVIDE
¶ Реализует in-place
TOS = TOS1 / TOS
.
-
INPLACE_MODULO
¶ Реализует in-place
TOS = TOS1 % TOS
.
-
INPLACE_ADD
¶ Реализует in-place
TOS = TOS1 + TOS
.
-
INPLACE_SUBTRACT
¶ Реализует in-place
TOS = TOS1 - TOS
.
-
INPLACE_LSHIFT
¶ Реализует in-place
TOS = TOS1 << TOS
.
-
INPLACE_RSHIFT
¶ Реализует in-place
TOS = TOS1 >> TOS
.
-
INPLACE_AND
¶ Реализует in-place
TOS = TOS1 & TOS
.
-
INPLACE_XOR
¶ Реализует in-place
TOS = TOS1 ^ TOS
.
-
INPLACE_OR
¶ Реализует in-place
TOS = TOS1 | TOS
.
-
STORE_SUBSCR
¶ Реализует
TOS1[TOS] = TOS2
.
-
DELETE_SUBSCR
¶ Реализует
del TOS1[TOS]
.
Опкоды корутин.
-
GET_AWAITABLE
¶ Реализует
TOS = get_awaitable(TOS)
, гдеget_awaitable(o)
возвращаетo
, еслиo
является объектом coroutine или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешаетo.__await__
.Добавлено в версии 3.5.
-
GET_AITER
¶ Реализует
TOS = TOS.__aiter__()
.Добавлено в версии 3.5.
Изменено в версии 3.7: Возврат ожидаемых объектов из
__aiter__
больше не поддерживается.
-
GET_ANEXT
¶ Выталкивает
get_awaitable(TOS.__anext__())
в стек. Подробности оGET_AWAITABLE
см. в разделеget_awaitable
.Добавлено в версии 3.5.
-
END_ASYNC_FOR
¶ Завершает цикл
async for
. Обрабатывает исключение, возникшее при ожидании следующего элемента. Если TOS равенStopAsyncIteration
, то извлеките 7 значений из стека и восстановите состояние исключения, используя вторые три из них. В противном случае повторно вызовите исключение, используя три значения из стека. Блок обработчика исключения удаляется из стека блоков.Добавлено в версии 3.8.
-
BEFORE_ASYNC_WITH
¶ Решает
__aenter__
и__aexit__
из объекта на вершине стека. Выталкивает__aexit__
и результат__aenter__()
в стек.Добавлено в версии 3.5.
-
SETUP_ASYNC_WITH
¶ Создает новый объект кадра.
Добавлено в версии 3.5.
Различные опкоды
-
PRINT_EXPR
¶ Реализует оператор выражения для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме оператор выражения завершается символом
POP_TOP
.
-
SET_ADD
(i)¶ Вызывает
set.add(TOS1[-i], TOS)
. Используется для реализации понимания множеств.
-
LIST_APPEND
(i)¶ Вызывает
list.append(TOS1[-i], TOS)
. Используется для реализации понимания списков.
-
MAP_ADD
(i)¶ Вызывает
dict.__setitem__(TOS1[-i], TOS1, TOS)
. Используется для реализации понимания диктов.Добавлено в версии 3.1.
Изменено в версии 3.8: Значение карты - TOS, а ключ карты - TOS1. Раньше эти значения были обратными.
Для всех инструкций SET_ADD
, LIST_APPEND
и MAP_ADD
, пока добавленное значение или пара ключ/значение выводится, объект-контейнер остается в стеке, чтобы быть доступным для дальнейших итераций цикла.
-
RETURN_VALUE
¶ Возвращается с TOS к вызывающей функции.
-
SETUP_ANNOTATIONS
¶ Проверяет, определен ли
__annotations__
вlocals()
, если нет, то устанавливается в пустойdict
. Этот опкод выдается, только если тело класса или модуля статически содержит variable annotations.Добавлено в версии 3.6.
-
IMPORT_STAR
¶ Загружает все символы, не начинающиеся с
'_'
, непосредственно из модуля TOS в локальное пространство имен. Модуль выводится после загрузки всех имен. Этот опкод реализуетfrom module import *
.
-
POP_BLOCK
¶ Удаляет один блок из стека блоков. В каждом кадре есть стек блоков, обозначающих утверждения
try
и тому подобное.
-
POP_EXCEPT
¶ Удаляет один блок из стека блоков. Выталкиваемый блок должен быть блоком обработчика исключений, поскольку он неявно создается при входе в обработчик исключений. Помимо удаления лишних значений из стека фреймов, последние три извлеченных значения используются для восстановления состояния исключения.
-
RERAISE
¶ Повторно поднимает исключение, находящееся на вершине стека. Если oparg ненулевой, восстанавливает
f_lasti
текущего кадра до его значения, когда было вызвано исключение.Добавлено в версии 3.9.
-
WITH_EXCEPT_START
¶ Вызывает функцию в позиции 7 на стеке с тремя верхними элементами на стеке в качестве аргументов. Используется для реализации вызова
context_manager.__exit__(*exc_info())
при возникновении исключения в оператореwith
.Добавлено в версии 3.9.
-
LOAD_ASSERTION_ERROR
¶ Выталкивает
AssertionError
на стек. Используется операторомassert
.Добавлено в версии 3.9.
-
LOAD_BUILD_CLASS
¶ Перемещает
builtins.__build_class__()
на стек. Позже он будет вызван командойCALL_FUNCTION
для построения класса.
-
SETUP_WITH
(delta)¶ Этот опкод выполняет несколько операций перед запуском блока with. Во-первых, он загружает
__exit__()
из менеджера контекста и помещает его в стек для последующего использованияWITH_EXCEPT_START
. Затем вызывается__enter__()
, и вставляется блок finally, указывающий на delta. Наконец, результат вызова метода__enter__()
помещается в стек. Следующий опкод либо игнорирует его (POP_TOP
), либо сохраняет в переменной (переменных) (STORE_FAST
,STORE_NAME
илиUNPACK_SEQUENCE
).Добавлено в версии 3.2.
-
COPY_DICT_WITHOUT_KEYS
¶ TOS - это кортеж ключей отображения, а TOS1 - объект сопоставления. Замените TOS на
dict
, сформированный из элементов TOS1, но без каких-либо ключей в TOS.Добавлено в версии 3.10.
-
GET_LEN
¶ Переместите
len(TOS)
в стек.Добавлено в версии 3.10.
-
MATCH_MAPPING
¶ Если TOS является экземпляром
collections.abc.Mapping
(или, более технически: если в его :c:const:`Py_TPFLAGS_MAPPING` установлен флаг :member:`~PyTypeObject.tp_flags`), вставьтеTrue
в стек. В противном случае, поместитеFalse
.Добавлено в версии 3.10.
-
MATCH_SEQUENCE
¶ Если TOS является экземпляром
collections.abc.Sequence
и не является экземпляромstr
/bytes
/bytearray
(или, более технически: если в его :c:const:`Py_TPFLAGS_SEQUENCE` установлен флаг :member:`~PyTypeObject.tp_flags`), засуньтеTrue
в стек. В противном случае, протолкнитеFalse
.Добавлено в версии 3.10.
-
MATCH_KEYS
¶ TOS - это кортеж ключей отображения, а TOS1 - субъект соответствия. Если TOS1 содержит все ключи в TOS, вставьте
tuple
, содержащий соответствующие значения, а затемTrue
. В противном случае, вставьтеNone
, а затемFalse
.Добавлено в версии 3.10.
Все следующие опкоды используют свои аргументы.
-
STORE_NAME
(namei)¶ Реализует
name = TOS
. namei - это индекс name в атрибутеco_names
объекта кода. Компилятор старается использоватьSTORE_FAST
илиSTORE_GLOBAL
, если это возможно.
-
DELETE_NAME
(namei)¶ Реализует
del name
, где namei - индекс в атрибутеco_names
объекта кода.
-
UNPACK_SEQUENCE
(count)¶ Распаковывает TOS на count отдельных значений, которые помещаются в стек справа налево.
-
UNPACK_EX
(counts)¶ Реализует присваивание со звездообразной целью: Распаковывает итерабельность в TOS на отдельные значения, причем общее число значений может быть меньше числа элементов в итерабельности: одним из новых значений будет список всех оставшихся элементов.
Младший байт counts - это количество значений перед значением списка, старший байт counts - количество значений после него. Полученные значения помещаются в стек справа налево.
-
STORE_ATTR
(namei)¶ Реализует
TOS.name = TOS1
, где namei - индекс имени вco_names
.
-
DELETE_ATTR
(namei)¶ Реализует
del TOS.name
, используя namei в качестве индекса вco_names
.
-
STORE_GLOBAL
(namei)¶ Работает как
STORE_NAME
, но сохраняет имя как глобальное.
-
DELETE_GLOBAL
(namei)¶ Работает как
DELETE_NAME
, но удаляет глобальное имя.
-
LOAD_CONST
(consti)¶ Вставляет
co_consts[consti]
в стек.
-
LOAD_NAME
(namei)¶ Выталкивает значение, связанное с
co_names[namei]
на стек.
-
BUILD_TUPLE
(count)¶ Создает кортеж, потребляющий count элементов из стека, и помещает полученный кортеж в стек.
-
BUILD_LIST
(count)¶ Работает как
BUILD_TUPLE
, но создает список.
-
BUILD_SET
(count)¶ Работает как
BUILD_TUPLE
, но создает набор.
-
BUILD_MAP
(count)¶ Выталкивает новый объект словаря на стек. Выбрасывает
2 * count
элементов так, чтобы словарь содержал count записей:{..., TOS3: TOS2, TOS1: TOS}
.Изменено в версии 3.5: Словарь создается из элементов стека вместо того, чтобы создавать пустой словарь, заранее рассчитанный на количество элементов.
-
BUILD_CONST_KEY_MAP
(count)¶ Версия
BUILD_MAP
, специализированная для константных ключей. Вытаскивает верхний элемент на стеке, который содержит кортеж ключей, затем, начиная сTOS1
, вытаскивает count значений для формирования значений в построенном словаре.Добавлено в версии 3.6.
-
BUILD_STRING
(count)¶ Конкатенирует count строк из стека и помещает полученную строку в стек.
Добавлено в версии 3.6.
-
LIST_TO_TUPLE
¶ Вытаскивает список из стека и вставляет кортеж, содержащий те же значения.
Добавлено в версии 3.9.
-
LIST_EXTEND
(i)¶ Вызывает
list.extend(TOS1[-i], TOS)
. Используется для построения списков.Добавлено в версии 3.9.
-
SET_UPDATE
(i)¶ Вызывает
set.update(TOS1[-i], TOS)
. Используется для построения наборов.Добавлено в версии 3.9.
-
DICT_UPDATE
(i)¶ Вызывает
dict.update(TOS1[-i], TOS)
. Используется для построения матриц.Добавлено в версии 3.9.
-
DICT_MERGE
¶ Аналогично
DICT_UPDATE
, но вызывает исключение для дублирующихся ключей.Добавлено в версии 3.9.
-
LOAD_ATTR
(namei)¶ Заменяет TOS на
getattr(TOS, co_names[namei])
.
-
COMPARE_OP
(opname)¶ Выполняет булеву операцию. Имя операции можно найти в
cmp_op[opname]
.
-
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]
. TOS и TOS1 выгружаются и предоставляют аргументы fromlist и level модуля__import__()
. Объект модуля заталкивается в стек. Текущее пространство имен не затрагивается: для правильного оператора импорта последующая инструкцияSTORE_FAST
изменяет пространство имен.
-
IMPORT_FROM
(namei)¶ Загружает атрибут
co_names[namei]
из модуля, найденного в TOS. Полученный объект заталкивается в стек, чтобы затем быть сохраненным инструкциейSTORE_FAST
.
-
JUMP_FORWARD
(delta)¶ Увеличивает счетчик байткода на дельта.
-
POP_JUMP_IF_TRUE
(target)¶ Если TOS равен true, устанавливает счетчик байткода в target. TOS отбрасывается.
Добавлено в версии 3.1.
-
POP_JUMP_IF_FALSE
(target)¶ Если TOS равен false, устанавливает счетчик байткода в цель. TOS выводится.
Добавлено в версии 3.1.
-
JUMP_IF_NOT_EXC_MATCH
(target)¶ Проверяет, является ли второе значение в стеке исключением, соответствующим TOS, и переходит, если нет. Вытаскивает два значения из стека.
Добавлено в версии 3.9.
-
JUMP_IF_TRUE_OR_POP
(target)¶ Если TOS истинно, устанавливает счетчик байткода в цель и оставляет TOS в стеке. В противном случае (TOS ложен), TOS выгружается.
Добавлено в версии 3.1.
-
JUMP_IF_FALSE_OR_POP
(target)¶ Если TOS ложен, устанавливает счетчик байткода в цель и оставляет TOS в стеке. В противном случае (TOS истинно), TOS выгружается.
Добавлено в версии 3.1.
-
JUMP_ABSOLUTE
(target)¶ Установите счетчик байткода на цель.
-
FOR_ITER
(delta)¶ TOS является iterator. Вызовите его метод
__next__()
. Если в результате будет получено новое значение, поместите его в стек (оставив итератор под ним). Если итератор показывает, что он исчерпан, TOS выгружается, а счетчик байт-кода увеличивается на дельта.
-
LOAD_GLOBAL
(namei)¶ Загружает в стек глобальное имя
co_names[namei]
.
-
SETUP_FINALLY
(delta)¶ Перемещает блок try из предложения try-finally или try-except в стек блоков. delta указывает на блок finally или первый блок except.
-
LOAD_FAST
(var_num)¶ Перемещает ссылку на локальный
co_varnames[var_num]
на стек.
-
STORE_FAST
(var_num)¶ Сохраняет TOS в локальном
co_varnames[var_num]
.
-
DELETE_FAST
(var_num)¶ Удаляет локальные
co_varnames[var_num]
.
-
LOAD_CLOSURE
(i)¶ Выталкивает ссылку на ячейку, содержащуюся в слоте i ячейки, и освобождает память переменной. Имя переменной
co_cellvars[i]
, если i меньше длины co_cellvars. В противном случае оно равноco_freevars[i - len(co_cellvars)]
.
-
LOAD_DEREF
(i)¶ Загружает ячейку, содержащуюся в слоте i ячейки, и освобождает переменную памяти. Выталкивает ссылку на объект, который содержит ячейка, в стек.
-
LOAD_CLASSDEREF
(i)¶ Аналогично
LOAD_DEREF
, но сначала проверяет словарь locals перед обращением к ячейке. Это используется для загрузки свободных переменных в телах классов.Добавлено в версии 3.4.
-
STORE_DEREF
(i)¶ Записывает TOS в ячейку, содержащуюся в слоте i ячейки, и освобождает память переменной.
-
DELETE_DEREF
(i)¶ Опустошает содержащуюся в слоте i ячейку и освобождает память переменной. Используется оператором
del
.Добавлено в версии 3.2.
-
RAISE_VARARGS
(argc)¶ Вызывает исключение, используя одну из 3 форм оператора
raise
, в зависимости от значения argc:0:
raise
(повторное поднятие предыдущего исключения)1:
raise TOS
(поднять экземпляр или тип исключения вTOS
)2:
raise TOS1 from TOS
(поднять экземпляр или тип исключения вTOS1
с__cause__
, установленным вTOS
)
-
CALL_FUNCTION
(argc)¶ Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов. Верхняя часть стека содержит позиционные аргументы, причем крайний правый аргумент находится сверху. Ниже аргументов находится вызываемый объект для вызова.
CALL_FUNCTION
снимает со стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и выталкивает возвращаемое значение, возвращенное вызываемым объектом.Изменено в версии 3.6: Этот опкод используется только для вызовов с позиционными аргументами.
-
CALL_FUNCTION_KW
(argc)¶ Вызывает вызываемый объект с позиционными (если есть) и ключевыми аргументами. argc указывает общее количество позиционных и ключевых аргументов. Верхний элемент стека содержит кортеж с именами аргументов ключевых слов, которые должны быть строками. Ниже находятся значения аргументов ключевых слов в порядке, соответствующем кортежу. Ниже идут позиционные аргументы, причем крайний правый параметр находится сверху. Под аргументами находится вызываемый объект для вызова.
CALL_FUNCTION_KW
снимает со стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и заталкивает возвращаемое значение, возвращенное вызываемым объектом.Изменено в версии 3.6: Аргументы ключевых слов упаковываются в кортеж, а не в словарь, argc указывает общее количество аргументов.
-
CALL_FUNCTION_EX
(flags)¶ Вызывает вызываемый объект с переменным набором позиционных и ключевых аргументов. Если младший бит flags установлен, то в верхней части стека находится объект отображения, содержащий дополнительные аргументы в виде ключевых слов. Перед вызовом вызываемого объекта объект отображения и объект iterable «распаковываются», а их содержимое передается в качестве ключевых и позиционных аргументов соответственно.
CALL_FUNCTION_EX
снимает со стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и вставляет возвращаемое значение, возвращенное вызываемым объектом.Добавлено в версии 3.6.
-
LOAD_METHOD
(namei)¶ Загружает метод с именем
co_names[namei]
из объекта TOS. TOS выталкивается. Этот байткод различает два случая: если в TOS есть метод с правильным именем, байткод выталкивает несвязанный метод и TOS. TOS будет использоваться в качестве первого аргумента (self
)CALL_METHOD
при вызове несвязанного метода. В противном случае проталкиваетсяNULL
и объект, возвращаемый поиском атрибутов.Добавлено в версии 3.7.
-
CALL_METHOD
(argc)¶ Вызывает метод. argc - количество позиционных аргументов. Аргументы с ключевыми словами не поддерживаются. Этот опкод предназначен для использования с
LOAD_METHOD
. Позиционные аргументы находятся на вершине стека. Под ними в стеке находятся два элемента, описанные вLOAD_METHOD
(либоself
и несвязанный объект метода, либоNULL
и произвольный вызываемый объект). Все они выталкиваются, а возвращаемое значение заталкивается.Добавлено в версии 3.7.
-
MAKE_FUNCTION
(flags)¶ Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент несет указанное значение флага
0x01
кортеж значений по умолчанию для параметров «только для позиции» и «позиция или ключевое слово» в позиционном порядке0x02
словарь значений по умолчанию параметров только для ключевых слов0x04
кортеж строк, содержащих аннотации параметров0x08
кортеж, содержащий ячейки для свободных переменных, образуя замыканиекод, связанный с функцией (в TOS1)
qualified name функции (в TOS)
Изменено в версии 3.10: Значение флага
0x04
представляет собой кортеж строк вместо словаря
-
BUILD_SLICE
(argc)¶ Помещает объект среза в стек. argc должно быть равно 2 или 3. Если 2, то заталкивается
slice(TOS1, TOS)
; если 3, то заталкиваетсяslice(TOS2, TOS1, TOS)
. Дополнительную информацию см. во встроенной функцииslice()
.
-
EXTENDED_ARG
(ext)¶ Префикс любого опкода, аргумент которого слишком велик, чтобы поместиться в один байт по умолчанию. ext содержит дополнительный байт, который действует как старшие биты в аргументе. Для каждого опкода допускается не более трех префиксальных
EXTENDED_ARG
, формирующих аргумент от двухбайтового до четырехбайтового.
-
FORMAT_VALUE
(flags)¶ Используется для реализации форматированных литеральных строк (f-строк). Загружает из стека необязательный fmt_spec, затем требуемое значение. флаги интерпретируются следующим образом:
(flags & 0x03) == 0x00
: значение форматируется как есть.(flags & 0x03) == 0x01
: вызовитеstr()
на значении перед его форматированием.(flags & 0x03) == 0x02
: вызовитеrepr()
на значении перед его форматированием.(flags & 0x03) == 0x03
: вызовитеascii()
на значении перед его форматированием.(flags & 0x04) == 0x04
: извлечь fmt_spec из стека и использовать его, иначе использовать пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format()
. Результат заносится в стек.Добавлено в версии 3.6.
-
MATCH_CLASS
(count)¶ TOS - кортеж имен атрибутов ключевых слов, TOS1 - класс, с которым производится сопоставление, TOS2 - субъект сопоставления. count - количество позиционных подшаблонов.
Вызовите TOS. Если TOS2 является экземпляром TOS1 и имеет позиционные и ключевые атрибуты, требуемые count и TOS, установите TOS в
True
и TOS1 в кортеж извлеченных атрибутов. В противном случае установите TOS вFalse
.Добавлено в версии 3.10.
-
GEN_START
(kind)¶ Вызывает TOS. Операнд
kind
соответствует типу генератора или coroutine. Легальными типами являются 0 для генератора, 1 для coroutine и 2 для async-генератора.Добавлено в версии 3.10.
-
ROT_N
(count)¶ Поднимите верхние счетные элементы стопки на одну позицию вверх и переместите TOS вниз на позицию счетные.
Добавлено в версии 3.10.
-
HAVE_ARGUMENT
¶ Это не совсем опкод. Он определяет разделительную линию между опкодами, которые не используют свой аргумент, и теми, которые используют (
< HAVE_ARGUMENT
и>= HAVE_ARGUMENT
, соответственно).Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды
< HAVE_ARGUMENT
игнорируют его. Раньше аргумент был только у опкодов>= HAVE_ARGUMENT
.
Коллекции опкодов¶
Эти коллекции предоставляются для автоматической интроспекции инструкций байткода:
-
dis.
opname
¶ Последовательность имен операций, индексируемых с помощью байткода.
-
dis.
opmap
¶ Словарь, отображающий имена операций на байткоды.
-
dis.
cmp_op
¶ Последовательность имен всех операций сравнения.
-
dis.
hasconst
¶ Последовательность байткодов, обращающихся к константе.
-
dis.
hasfree
¶ Последовательность байткодов, обращающихся к свободной переменной (обратите внимание, что «свободная» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости или имена во внешних областях видимости, на которые ссылаются из этой области видимости. Оно не включает ссылки на глобальные или встроенные области видимости).
-
dis.
hasname
¶ Последовательность байткодов, которые обращаются к атрибуту по имени.
-
dis.
hasjrel
¶ Последовательность байткодов, имеющих относительную цель перехода.
-
dis.
hasjabs
¶ Последовательность байткодов, имеющих абсолютную цель перехода.
-
dis.
haslocal
¶ Последовательность байткодов, которые обращаются к локальной переменной.
-
dis.
hascompare
¶ Последовательность байткодов булевых операций.