dis — Разборчик байткода Python
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байткода CPython байткода путём его дизассемблирования. Байткод CPython, который принимает на вход этот модуль, определён в файле Include/opcode.h и используется компилятором и интерпретатором.
Примечание реализации CPython: Байткод является деталью реализации интерпретатора 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» — номер строки).
32.12.1. Анализ байткода
Новое в версии 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().
-
Пример:
>>> bytecode = dis.Bytecode(myfunc) >>> for instr in bytecode: ... print(instr.opname) ... LOAD_GLOBAL LOAD_FAST CALL_FUNCTION RETURN_VALUE
32.12.2. Функции анализа
Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в требуемый вывод. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный аналитический объект не нужен:
-
dis.code_info(x) -
Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для предоставленной функции, генератора, метода, строки исходного кода или объекта кода.
Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации, и они могут произвольно изменяться на разных виртуальных машинах Python или версиях Python.
Новое в версии 3.2.
-
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) -
Дизассемблирует объект x. x может обозначать модуль, класс, метод, функцию, генератор, объект кода, строку исходного кода или последовательность байтов исходного байткода. Для модуля он дизассемблирует все функции. Для класса он дизассемблирует все методы (включая методы класса и статические методы). Для объекта кода или последовательности исходного байткода он печатает по одной строке на инструкцию байткода. Строки сначала компилируются в объекты кода с помощью встроенной функции
compile()перед дизассемблированием. Если объект не указан, эта функция дизассемблирует последнюю трассировку.Дизассемблирование записывается в текстовом виде в предоставленный параметр file, если он указан, и в
sys.stdoutв противном случае.Изменено в версии 3.4: Добавлен параметр file.
-
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_firstlinenoиco_lnotabобъекта кода code для поиска смещений, являющихся началом строк в исходном коде. Они генерируются как пары(offset, lineno). См. Objects/lnotab_notes.txt для форматаco_lnotabи способа его декодирования.Изменено в версии 3.6: Номера строк могут быть убывающими. Раньше они всегда были возрастающими.
-
dis.findlabels(code) -
Обнаруживает все смещения в объекте кода code, которые являются целевыми метками перехода, и возвращает список этих смещений.
-
dis.stack_effect(opcode[, oparg]) -
Вычисляет эффект стека для opcode с аргументом oparg.
Новое в версии 3.4.
32.12.3. Инструкции байткода Python
Функция get_instructions() и класс Bytecode предоставляют подробности инструкций байткода как экземпляры Instruction:
-
class dis.Instruction -
Подробности для байт-кодовой операции
-
opcode -
Числовой код операции, соответствующий значениям opcode, указанным ниже, и значениям байт-кода в Коллекциях opcode.
-
opname -
Читаемое человеком имя операции
-
arg -
Числовой аргумент операции (если есть), в противном случае
None
-
argval -
Разрешённое значение аргумента (если известно), в противном случае совпадает с arg
-
argrepr -
Читаемое человеком описание аргумента операции
-
offset -
Начальный индекс операции в последовательности байт-кода
-
starts_line -
Строка, начинающаяся с данного opcode (если есть), в противном случае
None
-
is_jump_target -
Trueесли другой код переходит сюда, в противном случаеFalse
Введено в версии 3.4.
-
Компилятор Python в настоящее время генерирует следующие инструкции байт-кода.
Общие инструкции
-
NOP -
Инструкция бездействия. Используется как заполнитель оптимизатором байт-кода.
-
POP_TOP -
Удаляет элемент вершины стека (TOS).
-
ROT_TWO -
Меняет местами два верхних элемента стека.
-
ROT_THREE -
Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний элемент вниз на позицию три.
-
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является объектом генератора-итератора или корутины, он остаётся неизменным. В противном случае, реализует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.
Операции на месте
Операции на месте похожи на бинарные операции, за исключением того, что они выполняют операцию на месте, когда это поддерживается TOS1, а результирующий TOS может быть (но не обязательно) исходным TOS1.
-
INPLACE_POWER -
Реализует операцию на месте
TOS = TOS1 ** TOS.
-
INPLACE_MULTIPLY -
Реализует операцию на месте
TOS = TOS1 * TOS.
-
INPLACE_MATRIX_MULTIPLY -
Реализует операцию на месте
TOS = TOS1 @ TOS.Введено в версии 3.5.
-
INPLACE_FLOOR_DIVIDE -
Реализует операцию на месте
TOS = TOS1 // TOS.
-
INPLACE_TRUE_DIVIDE -
Реализует операцию на месте
TOS = TOS1 / TOS.
-
INPLACE_MODULO -
Реализует операцию на месте
TOS = TOS1 % TOS.
-
INPLACE_ADD -
Реализует операцию на месте
TOS = TOS1 + TOS.
-
INPLACE_SUBTRACT -
Реализует операцию на месте
TOS = TOS1 - TOS.
-
INPLACE_LSHIFT -
Реализует операцию на месте
TOS = TOS1 << TOS.
-
INPLACE_RSHIFT -
Реализует операцию на месте
TOS = TOS1 >> TOS.
-
INPLACE_AND -
Реализует операцию на месте
TOS = TOS1 & TOS.
-
INPLACE_XOR -
Реализует операцию на месте
TOS = TOS1 ^ TOS.
-
INPLACE_OR -
Реализует операцию на месте
TOS = TOS1 | TOS.
-
STORE_SUBSCR -
Реализует
TOS1[TOS] = TOS2.
-
DELETE_SUBSCR -
Реализует
del TOS1[TOS].
Инструкции корутины
-
GET_AWAITABLE -
Реализует
TOS = get_awaitable(TOS), гдеget_awaitable(o)возвращаетoеслиoявляется объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешаетo.__await__.Введено в версии 3.5.
-
GET_AITER -
Реализует
TOS = get_awaitable(TOS.__aiter__()). СмотритеGET_AWAITABLEдля деталей оget_awaitableВведено в версии 3.5.
-
GET_ANEXT -
Реализует
PUSH(get_awaitable(TOS.__anext__())). СмотритеGET_AWAITABLEдля деталей оget_awaitableВведено в версии 3.5.
-
BEFORE_ASYNC_WITH -
Разрешает
__aenter__и__aexit__из объекта на вершине стека. Помещает__aexit__и результат__aenter__()в стек.Введено в версии 3.5.
-
SETUP_ASYNC_WITH -
Создаёт новый объект фрейма.
Введено в версии 3.5.
Разные opcode
-
PRINT_EXPR -
Реализует оператор выражения для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме оператор выражения завершается инструкцией
POP_TOP.
-
BREAK_LOOP -
Прерывает цикл из-за инструкции
break.
-
CONTINUE_LOOP(target) -
Продолжает цикл из-за инструкции
continue. target — адрес перехода (который должен быть инструкциейFOR_ITER).
-
SET_ADD(i) -
Вызывает
set.add(TOS1[-i], TOS). Используется для реализации множественных генераторов.
-
LIST_APPEND(i) -
Вызывает
list.append(TOS[-i], TOS). Используется для реализации генераторов списков.
-
MAP_ADD(i) -
Вызывает
dict.setitem(TOS1[-i], TOS, TOS1). Используется для реализации генераторов словарей.Добавлена в версии 3.1.
Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, при добавлении значения или пары ключ/значение, объект контейнера остаётся на стеке, чтобы он был доступен для дальнейших итераций цикла.
-
RETURN_VALUE -
Возвращает значение TOS вызывающей функции.
-
YIELD_VALUE -
Извлекает TOS и возвращает его из генератора.
-
YIELD_FROM -
Извлекает TOS и делегирует ему как под-итератору из генератора.
Добавлена в версии 3.3.
-
SETUP_ANNOTATIONS -
Проверяет, определён ли
__annotations__вlocals(). Если нет, он инициализируется пустымdict. Эта инструкция генерируется только в том случае, если тело класса или модуля содержит аннотации переменных статически.Добавлена в версии 3.6.
-
IMPORT_STAR -
Загружает все символы, не начинающиеся с
'_'непосредственно из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Эта инструкция реализуетfrom module import *.
-
POP_BLOCK -
Удаляет один блок из стека блоков. В каждом кадре есть стек блоков, обозначающих вложенные циклы, операторы try и т.п.
-
POP_EXCEPT -
Удаляет один блок из стека блоков. Удаляемый блок должен быть блоком обработки исключений, неявно создаваемым при входе в обработчик исключений. Помимо извлечения лишних значений из стека фрейма, последние три извлечённые значения используются для восстановления состояния исключения.
-
END_FINALLY -
Завершает блок
finally. Интерпретатор вспоминает, должно ли исключение быть повторно поднято или функция возвращается, и продолжает с внешним блоком.
-
LOAD_BUILD_CLASS -
Помещает
builtins.__build_class__()на стек. Позже оно вызывается инструкциейCALL_FUNCTIONдля построения класса.
-
SETUP_WITH(delta) -
Эта инструкция выполняет несколько операций перед началом блока with. Во-первых, она загружает
__exit__()из менеджера контекста и помещает его на стек для последующего использования инструкциейWITH_CLEANUP. Затем вызывается__enter__(), и на стек помещается блок finally, указывающий на delta. Наконец, результат вызова метода enter помещается на стек. Следующая инструкция либо проигнорирует его (POP_TOP), либо сохранит его в (одной или нескольких) переменных (STORE_FAST,STORE_NAMEилиUNPACK_SEQUENCE).Добавлена в версии 3.2.
-
WITH_CLEANUP_START -
Очищает стек при выходе из блока оператора
with. TOS — метод__exit__()менеджера контекста. Под TOS находятся 1–3 значения, указывающие, как/почему был вызван блок finally:- SECOND =
None - (SECOND, THIRD) = (
WHY_{RETURN,CONTINUE}), retval - SECOND =
WHY_*; без retval ниже - (SECOND, THIRD, FOURTH) = exc_info()
В последнем случае вызывается
TOS(SECOND, THIRD, FOURTH), в противном случаеTOS(None, None, None). На стек помещаются SECOND и результат вызова. - SECOND =
-
WITH_CLEANUP_FINISH -
Извлекает тип исключения и результат вызова функции «exit» со стека.
Если стек представляет исключение, и функция возвращает «истинное» значение, эта информация «удаляется» и заменяется одиночным
WHY_SILENCED, чтобы предотвратить повторное поднятие исключения инструкциейEND_FINALLY. (Однако нелокальные переходы всё ещё будут возобновлены.)
Все следующие инструкции используют свои аргументы.
-
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: Словарь создаётся из элементов стека, вместо создания пустого словаря предварительно размером, способным вместить count элементов.
-
BUILD_CONST_KEY_MAP(count) -
Версия
BUILD_MAP, специализированная для постоянных ключей. Из стека извлекаются count значений. Верхний элемент стека содержит кортеж ключей.Новая в версии 3.6.
-
BUILD_STRING(count) -
Конкатенирует count строк из стека и помещает результирующую строку в стек.
Новая в версии 3.6.
-
BUILD_TUPLE_UNPACK(count) -
Извлекает из стека count итерируемых объектов, объединяет их в один кортеж и помещает результат в стек. Реализует распаковку итерируемых объектов в отображения кортежей
(*x, *y, *z).Новая в версии 3.5.
-
BUILD_TUPLE_UNPACK_WITH_CALL(count) -
Аналогично
BUILD_TUPLE_UNPACK, но используется для синтаксиса вызоваf(*x, *y, *z). Элемент стека в позицииcount + 1должен быть соответствующей вызываемой функциейf.Новая в версии 3.6.
-
BUILD_LIST_UNPACK(count) -
Аналогично
BUILD_TUPLE_UNPACK, но помещает в стек список вместо кортежа. Реализует распаковку итерируемых объектов в списки[*x, *y, *z].Новая в версии 3.5.
-
BUILD_SET_UNPACK(count) -
Аналогично
BUILD_TUPLE_UNPACK, но помещает в стек множество вместо кортежа. Реализует распаковку итерируемых объектов в множества{*x, *y, *z}.Новая в версии 3.5.
-
BUILD_MAP_UNPACK(count) -
Извлекает из стека count словарей, объединяет их в один словарь и помещает результат в стек. Реализует распаковку словарей в отображения словарей
{**x, **y, **z}.Новая в версии 3.5.
-
BUILD_MAP_UNPACK_WITH_CALL(count) -
Аналогично
BUILD_MAP_UNPACK, но используется для синтаксиса вызоваf(**x, **y, **z). Элемент стека в позицииcount + 2должен быть соответствующей вызываемой функциейf.Новая в версии 3.5.
Изменено в версии 3.6: Позиция вызываемой функции определяется путем добавления 2 к аргументу операции, а не кодируется во втором байте аргумента.
-
LOAD_ATTR(namei) -
Заменяет TOS на
getattr(TOS, co_names[namei]).
-
COMPARE_OP(opname) -
Выполняет булеву операцию. Название операции можно найти в
cmp_op[opname].
-
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) -
Увеличивает счётчик байткода на delta.
-
POP_JUMP_IF_TRUE(target) -
Если TOS истинно, устанавливает счётчик байткода на target. TOS удаляется из стека.
Новая в версии 3.1.
-
POP_JUMP_IF_FALSE(target) -
Если TOS ложно, устанавливает счётчик байткода на target. TOS удаляется из стека.
Новая в версии 3.1.
-
JUMP_IF_TRUE_OR_POP(target) -
Если TOS истинно, устанавливает счётчик байткода на target и оставляет TOS в стеке. Иначе (TOS ложно), TOS удаляется из стека.
Новая в версии 3.1.
-
JUMP_IF_FALSE_OR_POP(target) -
Если TOS ложно, устанавливает счётчик байткода на target и оставляет TOS в стеке. Иначе (TOS истинно), TOS удаляется из стека.
Новая в версии 3.1.
-
JUMP_ABSOLUTE(target) -
Устанавливает счётчик байткода на target.
-
FOR_ITER(delta) -
TOS — итератор. Вызывается его метод
__next__(). Если это приводит к новому значению, оно помещается в стек (итератор остаётся ниже). Если итератор указывает на исчерпание, TOS удаляется, и счётчик байткода увеличивается на delta.
-
LOAD_GLOBAL(namei) -
Загружает глобальную переменную с именем
co_names[namei]в стек.
-
SETUP_LOOP(delta) -
Помещает блок цикла в стек блоков. Блок охватывает текущую инструкцию размером delta байт.
-
SETUP_EXCEPT(delta) -
Помещает блок обработки исключений из оператора try-except в стек блоков. delta указывает на первый блок except.
-
SETUP_FINALLY(delta) -
Помещает блок обработки исключений из оператора try-except в стек блоков. delta указывает на блок finally.
-
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].
-
STORE_ANNOTATION(namei) -
Сохраняет TOS как
locals()['__annotations__'][co_names[namei]] = TOS.Новая в версии 3.6.
-
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, но сначала проверяет словарь локальных переменных перед обращением к ячейке. Используется для загрузки свободных переменных в телах классов.Новая в версии 3.4.
-
STORE_DEREF(i) -
Сохраняет TOS в ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных.
-
DELETE_DEREF(i) -
Очищает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Используется оператором
del.Новая в версии 3.2.
-
RAISE_VARARGS(argc) -
Вызывает исключение. argc указывает на количество аргументов оператора raise, от 0 до 3. Обработчик найдёт трассировку стека как TOS2, параметр как TOS1, и само исключение как 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 установлен, в верхней части стека находится объект отображения, содержащий дополнительные именованные аргументы. Под ним находится итерируемый объект, содержащий позиционные аргументы, и вызываемый объект.
BUILD_MAP_UNPACK_WITH_CALLиBUILD_TUPLE_UNPACK_WITH_CALLмогут использоваться для объединения нескольких объектов отображения и итерируемых объектов, содержащих аргументы. Перед вызовом вызываемого объекта объекты отображения и итерируемые объекты распаковываются, и их содержимое передаётся соответственно в качестве именованных и позиционных аргументов.CALL_FUNCTION_EXизвлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта на стек.Добавлена в версии 3.6.
-
MAKE_FUNCTION(argc) -
Помещает на стек новый объект функции. Снизу вверх, потребляемый стек должен состоять из значений, если аргумент несёт указанное значение флага.
-
0x01кортеж значений по умолчанию для позиционных-только и позиционных-или-именованных параметров в позиционном порядке -
0x02словарь значений по умолчанию для именованных-только параметров -
0x04словарь аннотаций -
0x08кортеж, содержащий ячейки для свободных переменных, формируя замыкание - код, связанный с функцией (в TOS1)
- полное имя функции (в TOS)
-
-
BUILD_SLICE(argc) -
Помещает на стек объект среза. argc должен быть 2 или 3. Если это 2,
slice(TOS1, TOS)помещается на стек; если это 3,slice(TOS2, TOS1, TOS)помещается на стек. Смотрите встроенную функциюslice()для получения дополнительной информации.
-
EXTENDED_ARG(ext) -
Представляет собой префикс любого кода операции, у которого аргумент слишком большой для размещения в стандартные два байта. ext содержит два дополнительных байта, которые вместе с аргументом последующей операции образуют четырёхбайтный аргумент, ext представляя собой два старших байта.
-
FORMAT_VALUE(flags) -
Используется для реализации форматированных строковых литералов (f-строк). Извлекает необязательный fmt_spec со стека, а затем обязательный value. flags интерпретируется следующим образом:
-
(flags & 0x03) == 0x00: value форматируется как есть. -
(flags & 0x03) == 0x01: вызываетсяstr()для value перед его форматированием. -
(flags & 0x03) == 0x02: вызываетсяrepr()для value перед его форматированием. -
(flags & 0x03) == 0x03: вызываетсяascii()для value перед его форматированием. -
(flags & 0x04) == 0x04: извлекается fmt_spec со стека и используется, иначе используется пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format(). Результат помещается на стек.Добавлена в версии 3.6.
-
-
HAVE_ARGUMENT -
Это не совсем операция. Она определяет разделительную линию между операциями, не использующими свой аргумент, и теми, которые используют (соответственно,
< HAVE_ARGUMENTи>= HAVE_ARGUMENT).Изменено в версии 3.6: Теперь у каждой инструкции есть аргумент, но операции
< HAVE_ARGUMENTигнорируют его. Раньше только операции>= HAVE_ARGUMENTимели аргумент.
32.12.4. Сборники кодов операций
Эти наборы предоставляются для автоматического интроспекции инструкций байткода:
-
dis.opname -
Последовательность имён операций, индексируемая с использованием байткода.
-
dis.opmap -
Словарь, сопоставляющий имена операций с кодами операций.
-
dis.cmp_op -
Последовательность всех имён операций сравнения.
-
dis.hasconst -
Последовательность кодов операций, которые обращаются к константе.
-
dis.hasfree -
Последовательность кодов операций, которые обращаются к свободной переменной (обратите внимание, что «свободная» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или именам во внешних областях видимости, на которые ссылаются из этой области видимости. Она не включает ссылки на глобальные или встроенные области видимости).
-
dis.hasname -
Последовательность кодов операций, которые обращаются к атрибуту по имени.
-
dis.hasjrel -
Последовательность кодов операций, которые имеют относительную цель перехода.
-
dis.hasjabs -
Последовательность кодов операций, которые имеют абсолютную цель перехода.
-
dis.haslocal -
Последовательность кодов операций, которые обращаются к локальной переменной.
-
dis.hascompare -
Последовательность кодов операций булевых операций.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/dis.html