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=None, *, jump=None) -
Вычисляет эффект стека для opcode с аргументом oparg.
Если код имеет цель перехода, и jump
True,stack_effect()вернёт эффект стека при переходе. Если jumpFalse, он вернёт эффект стека при отсутствии перехода. И если jumpNone(по умолчанию), он вернёт максимальный эффект стека в обоих случаях.Введено в версии 3.4.
Изменено в версии 3.8: Добавлен параметр jump.
Инструкции байткода 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 -
Удаляет элемент из вершины стека.
-
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является объектом итератора генератора или корутины, он остаётся без изменений. В противном случае реализует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.
-
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 вызывающей функции.
-
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 -
Удаляет один блок из стека блоков. Удалённый блок должен быть блоком обработчика исключений, как неявно создаваемый при входе в обработчик исключений. В дополнение к удалению лишних значений из стека кадра, последние три извлечённые значения используются для восстановления состояния исключения.
-
RERAISE -
Повторно вызывает исключение, находящееся в данный момент на вершине стека.
Добавлена в версии 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.
Все следующие инструкции используют свои аргументы.
-
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 в отдельные значения, которые помещаются в стек справа налево.
-
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.
-
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__(). Объект модуля помещается на стек. Текущее пространство имён не затрагивается: для правильной инструкции 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_NOT_EXC_MATCH(target) -
Проверяет, является ли второй элемент на стеке исключением, соответствующим TOS, и переходит, если это не так. Два значения извлекаются со стека.
Новое в версии 3.9.
-
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_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, но сначала проверяет словарь локальных переменных перед обращением к ячейке. Используется для загрузки свободных переменных в телах классов.Новое в версии 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 установлен, верхняя часть стека содержит объект отображения, содержащий дополнительные ключевые аргументы. Перед вызовом вызываемого объекта объект отображения и итерируемый объект «распаковываются», и их содержимое передаётся соответственно в качестве ключевых и позиционных аргументов.
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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/dis.html