dis — Диссеблер для байткода Python
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ CPython байткода путём его дизассемблирования. CPython байткод, который этот модуль принимает в качестве входных данных, определён в файле Include/opcode.h и используется компилятором и интерпретатором.
Деталь реализации CPython: Байткод является деталью реализации интерпретатора CPython. Не гарантируется, что байткод не будет добавлен, удалён или изменён между версиями Python. Использование этого модуля не должно рассматриваться как работающее во всех виртуальных машинах Python или версиях Python.
Изменено в версии 3.6: Используются 2 байта для каждой инструкции. Ранее количество байтов варьировалось в зависимости от инструкции.
Изменено в версии 3.10: Аргумент инструкций переходов, обработки исключений и циклов теперь представляет собой смещение инструкции, а не смещение байта.
Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими записями кэша встраивания, которые имеют вид инструкций CACHE. Эти инструкции по умолчанию скрыты, но могут быть показаны, передав show_caches=True любому инструменту dis. Кроме того, интерпретатор теперь адаптирует байткод для специализации его под различные условия выполнения. Адаптированный байткод может быть показан путём передачи adaptive=True.
Пример: Учитывая функцию myfunc():
def myfunc(alist):
return len(alist)
следующая команда может быть использована для отображения дизассемблирования myfunc():
>>> dis.dis(myfunc)
2 0 RESUME 0
3 2 LOAD_GLOBAL 1 (NULL + len)
14 LOAD_FAST 0 (alist)
16 PRECALL 1
20 CALL 1
30 RETURN_VALUE
(«2» — номер строки).
Интерфейс командной строки
Модуль dis может быть вызван как скрипт из командной строки:
python -m dis [-h] [-C] [infile]
Принимаются следующие параметры:
-
-h, --help -
Отобразить использование и выйти.
-
-C, --show-caches -
Показать кэши встраивания.
Если infile указано, его дизассемблированный код будет записан в стандартный вывод. В противном случае дизассемблирование выполняется над скомпилированным исходным кодом, полученным со стандартного ввода.
Анализ байткода
Новое в версии 3.4.
API анализа байткода позволяет обернуть фрагменты кода Python в объект Bytecode, который предоставляет лёгкий доступ к деталям скомпилированного кода.
-
class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False) -
Проанализировать байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращается
compile()).Это удобная оболочка вокруг многих функций, перечисленных ниже, в частности
get_instructions(), так как итерирование по экземпляруBytecodeвозвращает операции байткода как экземплярыInstruction.Если first_line не
None, он указывает на номер строки, который должен быть показан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из объекта дизассемблированного кода.Если current_offset не
None, он относится к смещению инструкции в дизассемблированном коде. Установка этого значения означает, чтоdis()отобразит маркер «текущая инструкция» для указанного кода операции.Если show_caches
True,dis()отобразит записи кэша встраивания, используемые интерпретатором для специализации байткода.Если adaptive
True,dis()отобразит специализированный байткод, который может отличаться от исходного байткода.-
classmethod from_traceback(tb, *, show_caches=False) -
Создать экземпляр
Bytecodeиз заданного трассировки, установив current_offset на инструкцию, ответственную за исключение.
-
codeobj -
Объект скомпилированного кода.
-
first_line -
Первая строка исходного кода объекта (если доступна).
-
dis() -
Возвращает отформатированный вид операций байткода (то же, что печатается функцией
dis.dis(), но возвращаемый как многострочная строка).
-
info() -
Возвращает отформатированную многострочную строку со подробной информацией об объекте кода, как в
code_info().
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
-
Пример:
>>> bytecode = dis.Bytecode(myfunc) >>> for instr in bytecode: ... print(instr.opname) ... RESUME LOAD_GLOBAL LOAD_FAST PRECALL CALL RETURN_VALUE
Функции анализа
Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный объект анализа не нужен:
-
dis.code_info(x) -
Возвращает отформатированную многострочную строку с подробной информацией о кодовом объекте для предоставленной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или кодового объекта.
Обратите внимание, что точное содержимое строк code info сильно зависит от реализации и может произвольно меняться в разных виртуальных машинах Python или версиях Python.
Новая в версии 3.2.
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
dis.show_code(x, *, file=None) -
Выводит подробную информацию о кодовом объекте для предоставленной функции, метода, строки исходного кода или кодового объекта в file (или
sys.stdoutесли file не указано).Это удобное сокращение для
print(code_info(x), file=file), предназначенное для интерактивного изучения в командной строке интерпретатора.Новая в версии 3.2.
Изменено в версии 3.4: Добавлен параметр file.
-
dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False) -
Разобрать объект x. x может обозначать модуль, класс, метод, функцию, генератор, асинхронный генератор, корутину, кодовый объект, строку исходного кода или последовательность байткода. Для модуля он разбирает все функции. Для класса он разбирает все методы (включая методы класса и статические методы). Для кодового объекта или последовательности байткода он выводит по одной строке на каждую инструкцию байткода. Он также рекурсивно разбирает вложенные кодовые объекты (код списочных включений, генераторных выражений и вложенных функций, и код, используемый для создания вложенных классов). Строки сначала компилируются в кодовые объекты с помощью встроенной функции
compile()перед разбором. Если объект не указан, эта функция разбирает последний стек отслеживания.Разбор записывается в текстовом формате в предоставленный аргумент file, если он указан, и в
sys.stdoutв противном случае.Максимальная глубина рекурсии ограничена параметром depth, если он не
None.depth=0означает отсутствие рекурсии.Если show_caches
True, эта функция отобразит записи кэша инструкций, используемые интерпретатором для специализации байткода.Если adaptive
True, эта функция отобразит специализированный байт-код, который может отличаться от исходного байт-кода.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.7: Реализована рекурсивный разбор и добавлен параметр depth.
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
-
dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False) -
Разобрать функцию, находящуюся в вершине стека отслеживания исключений, используя последний стек отслеживания, если он не передан. Указана инструкция, вызвавшая исключение.
Разбор записывается в текстовом формате в предоставленный аргумент file, если он указан, и в
sys.stdoutв противном случае.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
-
dis.disassemble(code, lasti=- 1, *, file=None, show_caches=False, adaptive=False) -
dis.disco(code, lasti=- 1, *, file=None, show_caches=False, adaptive=False) -
Разобрать кодовый объект, указав последнюю инструкцию, если lasti был передан. Вывод разделен на следующие столбцы:
- номер строки, для первой инструкции каждой строки
- текущая инструкция, обозначенная как
-->, - метка инструкции, обозначенная как
>>, - адрес инструкции,
- имя кода операции,
- параметры операции и
- интерпретация параметров в скобках.
Интерпретация параметров распознаёт имена локальных и глобальных переменных, значения констант, целевые адреса переходов и операторы сравнения.
Разбор записывается в текстовом формате в предоставленный аргумент file, если он указан, и в
sys.stdoutв противном случае.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
-
dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False) -
Возвращает итератор по инструкциям в предоставленной функции, методе, строке исходного кода или кодовом объекте.
Итератор генерирует серию именованных кортежей
Instruction, содержащих подробности каждой операции в предоставленном коде.Если first_line не
None, он указывает номер строки, который должен быть представлен для первой строки исходного кода в разобранном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из разобранного кодового объекта.Параметры show_caches и adaptive работают так же, как в
dis().Новая в версии 3.4.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
-
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()вернёт эффект перехода. Если jumpFalse, он вернёт эффект отсутствия перехода. А если jumpNone(по умолчанию), он вернёт максимальный эффект перехода в обоих случаях.Новая в версии 3.4.
Изменено в версии 3.8: Добавлен параметр jump.
Инструкции байткода Python
Функция get_instructions() и класс Bytecode предоставляют подробную информацию об инструкциях байткода в виде экземпляров Instruction:
-
class dis.Instruction -
Подробности для операции байткода
-
opcode -
Числовой код операции, соответствующий значениям кодов операций, указанным ниже, и значениям байткода в Коллекциях кодов операций.
-
opname -
Читаемое человеком имя операции
-
arg -
Числовой аргумент операции (если есть), в противном случае
None
-
argval -
Разрешенное значение аргумента (если есть), в противном случае
None
-
argrepr -
Читаемое человеком описание аргумента операции (если есть), в противном случае пустая строка.
-
offset -
Начальный индекс операции в последовательности байткода
-
starts_line -
Строка, начинающаяся с этой кодовой операции (если есть), в противном случае
None
-
is_jump_target -
Trueесли другая часть кода переходит сюда, в противном случаеFalse
-
positions -
Объект
dis.Positions, содержащий начальные и конечные позиции, которые покрывает эта инструкция.
Новая функция в версии 3.4.
Изменено в версии 3.11: Поле
positionsдобавлено. -
-
class dis.Positions -
В случае, если информация недоступна, некоторые поля могут быть
None.-
lineno
-
end_lineno
-
col_offset
-
end_col_offset
Новая функция в версии 3.11.
-
Компилятор Python в настоящее время генерирует следующие инструкции байткода.
Общие инструкции
-
NOP -
Инструкция без действия. Используется в качестве заполнителя оптимизатором байткода и для генерации событий отслеживания строк.
-
POP_TOP -
Удаляет элемент из вершины стека (TOS).
-
COPY(i) -
Помещает i-й элемент в верхнюю часть стека. Элемент не удаляется из его исходного местоположения.
Новая функция в версии 3.11.
-
SWAP(i) -
Меняет местами TOS и элемент в позиции i.
Новая функция в версии 3.11.
-
CACHE -
Эта кодовая операция не является фактической инструкцией, а используется для выделения дополнительного места для кэширования полезных данных интерпретатором непосредственно в самом байткоде. Она автоматически скрывается всеми
disутилитами, но может быть отображена с помощьюshow_caches=True.Логически, это пространство является частью предшествующей инструкции. Многие кодовые операции ожидают следования за ними точного количества кэшей и будут инструктировать интерпретатор пропустить их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует проявлять осторожность при чтении или изменении исходного, адаптивного байткода, содержащего ускоренные данные.
Новая функция в версии 3.11.
Унарные операции
Унарные операции берут верхний элемент стека, применяют операцию и помещают результат обратно в стек.
-
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). Они выполняют операцию и помещают результат обратно в стек.
Операции in-place похожи на бинарные операции в том, что они удаляют TOS и TOS1, и помещают результат обратно в стек, но операция выполняется непосредственно, когда TOS1 поддерживает это, и результирующий TOS может быть (но не обязательно) исходным TOS1.
-
BINARY_OP(op) -
Реализует бинарные и in-place операторы (в зависимости от значения op).
Новая функция в версии 3.11.
-
BINARY_SUBSCR -
Реализует
TOS = TOS1[TOS].
-
STORE_SUBSCR -
Реализует
TOS1[TOS] = TOS2.
-
DELETE_SUBSCR -
Реализует
del TOS1[TOS].
Операции корутин
-
GET_AWAITABLE(where) -
Реализует
TOS = get_awaitable(TOS), гдеget_awaitable(o)возвращаетoеслиoявляется объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешаетo.__await__.Если операнд
whereотличен от нуля, он указывает местоположение инструкции:-
1После вызова__aenter__ -
2После вызова__aexit__
Новая функция в версии 3.5.
Изменено в версии 3.11: Ранее у этой инструкции не было oparg.
-
-
GET_AITER -
Реализует
TOS = TOS.__aiter__().Новая функция в версии 3.5.
Изменено в версии 3.7: Возврат объектов awaitable из
__aiter__больше не поддерживается.
-
GET_ANEXT -
Помещает
get_awaitable(TOS.__anext__())в стек. См.GET_AWAITABLEдля получения подробной информации обget_awaitable.Новая функция в версии 3.5.
-
END_ASYNC_FOR -
Завершает цикл
async for. Обрабатывает исключение, поднятое при ожидании следующего элемента. В стеке находится асинхронная итерируемая переменная в TOS1 и поднятое исключение в TOS. Оба из них извлекаются. Если исключение не являетсяStopAsyncIteration, оно повторно поднимается.Новая функция в версии 3.8.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного, а не трех, элементов.
-
BEFORE_ASYNC_WITH -
Разрешает
__aenter__и__aexit__из объекта вверху стека. Помещает__aexit__и результат__aenter__()в стек.Добавлена в версии 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 и возвращает его из генератора.
-
SETUP_ANNOTATIONS -
Проверяет, определен ли
__annotations__вlocals(), если нет, он устанавливается в пустойdict. Эта инструкция генерируется только в том случае, если тело класса или модуля содержит аннотации переменных статически.Добавлена в версии 3.6.
-
IMPORT_STAR -
Загружает все символы, не начинающиеся с
'_'напрямую из модуля TOS в локальное пространство имен. Модуль извлекается после загрузки всех имен. Эта инструкция реализуетfrom module import *.
-
POP_EXCEPT -
Извлекает значение из стека, которое используется для восстановления состояния исключения.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного, а не трех элементов.
-
RERAISE -
Перевыбрасывает исключение, которое в настоящее время находится вверху стека. Если oparg не равен нулю, извлекает дополнительное значение из стека, которое используется для установки
f_lastiтекущей фрейма.Добавлена в версии 3.9.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного, а не трех элементов.
-
PUSH_EXC_INFO -
Извлекает значение из стека. Помещает текущее исключение в верхнюю часть стека. Возвращает извлеченное значение обратно в стек. Используется в обработчиках исключений.
Добавлена в версии 3.11.
-
CHECK_EXC_MATCH -
Производит сопоставление исключений для
except. Проверяет, является ли TOS1 исключением, соответствующим TOS. Извлекает TOS и помещает в стек логическое значение результата проверки.Добавлена в версии 3.11.
-
CHECK_EG_MATCH -
Производит сопоставление исключений для
except*. Применяетsplit(TOS)к группе исключений, представляющей TOS1.В случае совпадения извлекает два элемента из стека и помещает в стек несовпадающую подгруппу (
Noneв случае полного совпадения) и затем совпадающую подгруппу. При отсутствии совпадения извлекает один элемент (тип совпадения) и помещаетNone.Добавлена в версии 3.11.
-
PREP_RERAISE_STAR -
Объединяет список поднятых и перевыброшенных исключений из TOS в группу исключений для распространения из блока try-except*. Использует исходную группу исключений из TOS1 для реконструкции структуры перевыброшенных исключений. Извлекает два элемента из стека и помещает в стек исключение для перевыброса или
Noneесли такового нет.Добавлена в версии 3.11.
-
WITH_EXCEPT_START -
Вызывает функцию в позиции 4 стека с аргументами (тип, значение, трассировка), представляющими исключение в верхней части стека. Используется для реализации вызова
context_manager.__exit__(*exc_info())при возникновении исключения в оператореwith.Добавлена в версии 3.9.
Изменено в версии 3.11: Функция
__exit__находится в позиции 4 стека, а не 7. Представление исключения в стеке теперь состоит из одного, а не трех элементов.
-
LOAD_ASSERTION_ERROR -
Помещает
AssertionErrorв стек. Используется операторомassert.Добавлена в версии 3.9.
-
LOAD_BUILD_CLASS -
Помещает
builtins.__build_class__()в стек. Позже оно вызывается для создания класса.
-
BEFORE_WITH(delta) -
Эта инструкция выполняет несколько операций перед началом блока with. Сначала она загружает
__exit__()из менеджера контекста и помещает его в стек для последующего использования инструкциейWITH_EXCEPT_START. Затем вызывается__enter__(). Наконец, результат вызова метода__enter__()помещается в стек.Добавлена в версии 3.11.
-
GET_LEN -
Помещает
len(TOS)в стек.Добавлена в версии 3.10.
-
MATCH_MAPPING -
Если TOS является экземпляром
collections.abc.Mapping(или, точнее, если для него установлен флагPy_TPFLAGS_MAPPINGвtp_flags), помещаетTrueв стек. В противном случае, помещаетFalse.Добавлена в версии 3.10.
-
MATCH_SEQUENCE -
Если TOS является экземпляром
collections.abc.Sequenceи не является экземпляромstr/bytes/bytearray(или, точнее, если для него установлен флагPy_TPFLAGS_SEQUENCEвtp_flags), помещаетTrueв стек. В противном случае, помещаетFalse.Добавлена в версии 3.10.
-
MATCH_KEYS -
TOS — это кортеж ключей отображения, а TOS1 — это предмет сопоставления. Если TOS1 содержит все ключи в TOS, то на стек помещается
tuple, содержащий соответствующие значения. В противном случае помещаетсяNone.Добавлена в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также помещала на стек логическое значение, указывающее на успех (
True) или неудачу (False).
-
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.
-
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(i) -
Подобно
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) -
Увеличивает счетчик байткода на delta.
-
JUMP_BACKWARD(delta) -
Уменьшает счетчик байткода на delta. Проверяет наличие прерываний.
Добавлена в версии 3.11.
-
JUMP_BACKWARD_NO_INTERRUPT(delta) -
Уменьшает счетчик байткода на delta. Не проверяет наличие прерываний.
Добавлена в версии 3.11.
-
POP_JUMP_FORWARD_IF_TRUE(delta) -
Если TOS истинно, увеличивает счетчик байткода на delta. TOS извлекается.
Добавлена в версии 3.11.
-
POP_JUMP_BACKWARD_IF_TRUE(delta) -
Если TOS истинно, уменьшает счетчик байткода на delta. TOS извлекается.
Добавлена в версии 3.11.
-
POP_JUMP_FORWARD_IF_FALSE(delta) -
Если TOS ложно, увеличивает счётчик байткода на delta. TOS извлекается.
Добавлена в версии 3.11.
-
POP_JUMP_BACKWARD_IF_FALSE(delta) -
Если TOS ложно, уменьшает счётчик байткода на delta. TOS извлекается.
Добавлена в версии 3.11.
-
POP_JUMP_FORWARD_IF_NOT_NONE(delta) -
Если TOS не
None, увеличивает счётчик байткода на delta. TOS извлекается.Добавлена в версии 3.11.
-
POP_JUMP_BACKWARD_IF_NOT_NONE(delta) -
Если TOS не
None, уменьшает счётчик байткода на delta. TOS извлекается.Добавлена в версии 3.11.
-
POP_JUMP_FORWARD_IF_NONE(delta) -
Если TOS
None, увеличивает счётчик байткода на delta. TOS извлекается.Добавлена в версии 3.11.
-
POP_JUMP_BACKWARD_IF_NONE(delta) -
Если TOS
None, уменьшает счётчик байткода на delta. TOS извлекается.Добавлена в версии 3.11.
-
JUMP_IF_TRUE_OR_POP(delta) -
Если TOS истинно, увеличивает счётчик байткода на delta и оставляет TOS в стеке. В противном случае (TOS ложно), TOS извлекается.
Добавлена в версии 3.1.
Изменено в версии 3.11: Оператор теперь является относительным смещением, а не абсолютной целью.
-
JUMP_IF_FALSE_OR_POP(delta) -
Если TOS ложно, увеличивает счётчик байткода на delta и оставляет TOS в стеке. В противном случае (TOS истинно), TOS извлекается.
Добавлена в версии 3.1.
Изменено в версии 3.11: Оператор теперь является относительным смещением, а не абсолютной целью.
-
FOR_ITER(delta) -
TOS — это итератор. Вызывается его метод
__next__(). Если это возвращает новое значение, то оно помещается в стек (итератор остаётся ниже). Если итератор указывает, что он исчерпан, TOS извлекается, и счётчик байткода увеличивается на delta.
-
LOAD_GLOBAL(namei) -
Загружает глобальную переменную с именем
co_names[namei>>1]в стек.Изменено в версии 3.11: Если младший бит
nameiустановлен, то в стек перед глобальной переменной помещаетсяNULL.
-
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].
-
MAKE_CELL(i) -
Создаёт новую ячейку в слоте
i. Если этот слот не пустой, то значение из него сохраняется в новой ячейке.Добавлена в версии 3.11.
-
LOAD_CLOSURE(i) -
Помещает ссылку на ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных». Имя переменной —co_fastlocalnames[i].Обратите внимание, что
LOAD_CLOSUREпо сути является псевдонимом дляLOAD_FAST. Оно существует для повышения читаемости байткода.Изменено в версии 3.11:
iбольше не смещается относительно длиныco_varnames.
-
LOAD_DEREF(i) -
Загружает ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных». Помещает ссылку на объект, содержащийся в ячейке, в стек.Изменено в версии 3.11:
iбольше не смещается относительно длиныco_varnames.
-
LOAD_CLASSDEREF(i) -
Аналогично
LOAD_DEREF, но сначала проверяет словарь локальных переменных, прежде чем обратиться к ячейке. Используется для загрузки свободных переменных в телах классов.Добавлена в версии 3.4.
Изменено в версии 3.11:
iбольше не смещается относительно длиныco_varnames.
-
STORE_DEREF(i) -
Сохраняет TOS в ячейке, содержащейся в слоте
iхранилища «быстрых локальных переменных».Изменено в версии 3.11:
iбольше не смещается относительно длиныco_varnames.
-
DELETE_DEREF(i) -
Очищает ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных». Используется операторомdel.Добавлена в версии 3.2.
Изменено в версии 3.11:
iбольше не смещается относительно длиныco_varnames.
-
COPY_FREE_VARS(n) -
Копирует
nсвободные переменные из замыкания во фрейм. Устраняет необходимость специального кода на стороне вызывающего объекта при вызове замыканий.Добавлена в версии 3.11.
-
RAISE_VARARGS(argc) -
Вызывает исключение, используя одну из 3 форм оператора
raise, в зависимости от значения argc:- 0:
raise(повторное возбуждение предыдущего исключения) - 1:
raise TOS(возбуждение экземпляра или типа исключения вTOS) - 2:
raise TOS1 from TOS(возбуждение экземпляра или типа исключения вTOS1со значением__cause__равнымTOS)
- 0:
-
CALL(argc) -
Вызывает вызываемый объект с количеством аргументов, указанным
argc, включая именованные аргументы, указанные предшествующимKW_NAMES, если таковые имеются. В стеке (в порядке возрастания) находятся:- NULL
- Вызываемый объект
- Позиционные аргументы
- Именованные аргументы
или:
- Вызываемый объект
self- Остальные позиционные аргументы
- Именованные аргументы
argc— это общее количество позиционных и именованных аргументов, за исключениемself, еслиNULLотсутствует.CALLизвлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта в стек.Добавлена в версии 3.11.
-
CALL_FUNCTION_EX(flags) -
Вызывает вызываемый объект с переменным набором позиционных и именованных аргументов. Если младший бит flags установлен, вершина стека содержит объект отображения, содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта объект отображения и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно.
CALL_FUNCTION_EXизвлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта в стек.Добавлена в версии 3.6.
-
LOAD_METHOD(namei) -
Загружает метод с именем
co_names[namei]из объекта TOS. TOS извлекается. Этот байткод различает два случая: если у TOS есть метод с правильным именем, байткод помещает незавязанный метод и TOS. TOS будет использоваться в качестве первого аргумента (self) инструкциейCALLпри вызове незавязанного метода. В противном случае,NULLи объект, возвращаемый при поиске атрибута, помещаются на стек.Добавлена в версии 3.7.
-
PRECALL(argc) -
Представляет собой префикс для инструкции
CALL. Логически это ничто. Она существует для повышения эффективности специализации вызовов.argc— количество аргументов, как описано вCALL.Добавлена в версии 3.11.
-
PUSH_NULL -
Помещает
NULLна стек. Используется в последовательности вызова для соответствияNULL, помещённому инструкциейLOAD_METHODдля вызовов не методов.Добавлена в версии 3.11.
-
KW_NAMES(i) -
Представляет собой префикс для инструкции
PRECALL. Сохраняет ссылку наco_consts[consti]во внутреннюю переменную для использования инструкциейCALL.co_consts[consti]должно быть кортежем строк.Добавлена в версии 3.11.
-
MAKE_FUNCTION(flags) -
Помещает новый объект функции на стек. Стек, считываемый снизу вверх, должен состоять из значений, если аргумент содержит указанное флаговое значение
-
0x01кортеж значений по умолчанию для позиционных-только и позиционных-или-ключевых параметров в позиционном порядке -
0x02словарь значений по умолчанию для ключевых-только параметров -
0x04кортеж строк, содержащих аннотации параметров -
0x08кортеж, содержащий ячейки для свободных переменных, создающий замыкание - код, связанный с функцией (на TOS)
Изменено в версии 3.10: Флаговое значение
0x04— кортеж строк вместо словаряИзменено в версии 3.11: Удалён квалифицированное имя в 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.
-
-
MATCH_CLASS(count) -
TOS — кортеж имён ключевых атрибутов, TOS1 — класс, с которым сравнивается, а TOS2 — объект, с которым сравнивается. count — количество позиционных под-шаблонов.
Извлекаются TOS, TOS1 и TOS2. Если TOS2 является экземпляром TOS1 и имеет необходимые позиционные и ключевые атрибуты, согласно count и TOS, то на стек помещается кортеж извлечённых атрибутов. В противном случае, помещается
None.Добавлена в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также помещала на стек булево значение, указывающее на успех (
True) или неудачу (False).
-
RESUME(where) -
Пустая операция. Выполняет внутренний отслеживания, отладку и проверки оптимизации.
Операнд
whereотмечает место, где происходитRESUME:-
0Начало функции -
1После выраженияyield -
2После выраженияyield from -
3После выраженияawait
Добавлена в версии 3.11.
-
-
RETURN_GENERATOR -
Создаёт генератор, корутину или асинхронный генератор из текущей рамки. Очищает текущую рамку и возвращает созданный генератор.
Добавлена в версии 3.11.
-
SEND -
Отправляет
Noneв подгенератор этого генератора. Используется в выраженияхyield fromиawait.Добавлена в версии 3.11.
-
ASYNC_GEN_WRAP -
Оборачивает значение на вершине стека в
async_generator_wrapped_value. Используется для yield в асинхронных генераторах.Добавлена в версии 3.11.
-
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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/dis.html