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» — номер строки).
Анализ байткода
Введено в версии 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: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
Пример:
>>> bytecode = dis.Bytecode(myfunc) >>> for instr in bytecode: ... print(instr.opname) ... LOAD_GLOBAL LOAD_FAST CALL_FUNCTION RETURN_VALUE
Функции анализа
Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый результат. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный аналитический объект не нужен:
-
dis.code_info(x) -
Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для заданной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.
Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться между виртуальными машинами Python или выпусками Python.
Введено в версии 3.2.
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
dis.show_code(x, *, file=None) -
Печатает подробную информацию об объекте кода для заданной функции, метода, строки исходного кода или объекта кода в file (или
sys.stdoutесли file не указан).Это удобное сокращение для
print(code_info(x), file=file), предназначенное для интерактивного исследования в командной строке интерпретатора.Введено в версии 3.2.
Изменено в версии 3.4: Добавлен параметр file.
-
dis.dis(x=None, *, file=None, depth=None) -
Дизассемблирует объект x. x может обозначать модуль, класс, метод, функцию, генератор, асинхронный генератор, корутину, объект кода, строку исходного кода или последовательность байтов исходного байткода. Для модуля он дизассемблирует все функции. Для класса он дизассемблирует все методы (включая методы класса и статические методы). Для объекта кода или последовательности байтов исходного байткода он печатает одну строку на инструкцию байткода. Также он рекурсивно дизассемблирует вложенные объекты кода (код генераций списков, выражений генераторов и вложенных функций, и код, используемый для создания вложенных классов). Строки сначала компилируются в объекты кода с помощью встроенной функции
compile(), а затем дизассемблируются. Если объект не указан, эта функция дизассемблирует последний стек отслеживания исключений.Дизассемблирование записывается в виде текста в предоставленный аргумент file, если он указан, и в
sys.stdoutв противном случае.Максимальная глубина рекурсии ограничена depth, если она не равна
None.depth=0означает отсутствие рекурсии.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.7: Реализовано рекурсивное дизассемблирование и добавлен параметр depth.
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
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]) -
Вычислить эффект стека для кода_операции с аргументом oparg.
Новое в версии 3.4.
Инструкции байткода Python
Функция get_instructions() и класс Bytecode предоставляют подробную информацию об инструкциях байткода в виде экземпляров Instruction:
-
class dis.Instruction -
Подробная информация об операции байткода
-
opcode -
Числовой код операции, соответствующий значениям кодов операций, перечисленным ниже, и значениям байткода в Коллекциях кодов операций.
-
opname -
Название операции в удобочитаемом формате
-
arg -
Числовой аргумент операции (если есть), в противном случае
None
-
argval -
Раскрытое значение аргумента (если известно), в противном случае совпадает с arg
-
argrepr -
Удобочитаемое описание аргумента операции
-
offset -
Начальный индекс операции в последовательности байткода
-
starts_line -
Строка, начатая этой операцией (если есть), в противном случае
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.
Операции на месте
Операции на месте похожи на бинарные операции, в том смысле, что они удаляют TOS и TOS1, и возвращают результат обратно на стек, но операция выполняется на месте, если 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 = TOS.__aiter__().Новое в версии 3.5.
Изменено в версии 3.7: Возврат объектов awaitable из
__aiter__больше не поддерживается.
-
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.
Разные инструкции
-
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. (Но нелокальныe переходы по-прежнему будут возобновлены.)
Все следующие инструкции используют свои аргументы.
-
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, специализированный для постоянных ключей. Извлекает верхний элемент стека, содержащий кортеж ключей, затем, начиная сTOS1, извлекает 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 из try-except блока в стек блоков. delta указывает на первый блок except.
-
SETUP_FINALLY(delta) -
Помещает блок try из 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].
-
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) -
Вызывает исключение, используя одну из 3 форм инструкции
raise, в зависимости от значения argc:- 0:
raise(повторное поднятие предыдущего исключения) - 1:
raise TOS(вызов исключения экземпляра или типа вTOS) - 2:
raise TOS1 from TOS(вызов исключения экземпляра или типа вTOS1с__cause__установленным вTOS)
- 0:
-
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.
-
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)
- полное имя функции (в TOS)
-
-
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 со стека, затем необходимый 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.
Сборки инструкций
Эти сборки предоставляются для автоматического интроспекции инструкций байткода:
-
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.7/library/dis.html