Spec-Zone.ru › Python 3.10

dis — Диссеблер для байткода Python

Исходный код: Lib/dis.py

Модуль dis поддерживает анализ байткода CPython, дизассемблируя его. Байткод CPython, который принимает на вход этот модуль, определен в файле Include/opcode.h и используется компилятором и интерпретатором.

Подробность реализации CPython: Байткод — это деталь реализации интерпретатора CPython. Не гарантируется, что байткод не будет добавлен, удален или изменён между версиями Python. Использование этого модуля не должно считаться совместимым с другими виртуальными машинами Python или версиями Python.

Изменено в версии 3.6: Используется 2 байта для каждой инструкции. Раньше количество байтов варьировалось в зависимости от инструкции.

Изменено в версии 3.10: Аргумент инструкций перехода, обработки исключений и циклов теперь является смещением инструкции, а не смещением байта.

Пример: Дана функция 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. Вывод разделен на следующие столбцы:

  1. номер строки, для первой инструкции каждой строки
  2. текущая инструкция, обозначенная как -->,
  3. метка инструкции, обозначенная как >>,
  4. адрес инструкции,
  5. имя кода операции,
  6. параметры операции и
  7. интерпретация параметров в скобках.

Интерпретация параметров распознает имена локальных и глобальных переменных, значения констант, цели ветвления и операторы сравнения.

Разобранный код записывается в текст в предоставленный аргумент file, если он указан, и в sys.stdout в противном случае.

Изменено в версии 3.4: Добавлен параметр file.

dis.get_instructions(x, *, first_line=None)

Возвращает итератор по инструкциям в предоставленной функции, методе, строке исходного кода или объекте кода.

Итератор генерирует последовательность кортежей Instruction, предоставляющих подробную информацию о каждой операции в предоставленном коде.

Если first_line не None, он указывает номер строки, который должен быть показан для первой строки исходного кода в разобранном коде. В противном случае информация о строке исходного кода (если она есть) берётся непосредственно из объекта разобранного кода.

Новая в версии 3.4.

dis.findlinestarts(code)

Эта функция-генератор использует метод co_lines объекта кода code для поиска смещений, которые являются началом строк в исходном коде. Они генерируются как пары (offset, lineno).

Изменено в версии 3.6: Номера строк могут быть уменьшающимися. Ранее они всегда увеличивались.

Изменено в версии 3.10: Используется метод PEP 626 co_lines вместо атрибутов co_firstlineno и co_lnotab объекта кода.

dis.findlabels(code)

Обнаруживает все смещения в исходной строке скомпилированного байткода code, которые являются целями переходов, и возвращает список этих смещений.

dis.stack_effect(opcode, oparg=None, *, jump=None)

Вычисляет эффект стека для opcode с аргументом oparg.

Если код имеет целевой переход, и jump равен True, stack_effect() вернёт эффект стека для перехода. Если jump равен False, он вернёт эффект стека для неперехода. А если jump равен None (по умолчанию), он вернёт максимальный эффект стека для обоих случаев.

Новая в версии 3.4.

Изменено в версии 3.8: Добавлен параметр jump.

END_OF_DOCUMENT_MARKER

Инструкции байткода Python

Функция get_instructions() и класс Bytecode предоставляют подробную информацию об инструкциях байткода в виде экземпляров Instruction:

class dis.Instruction

Подробности для операции байткода

opcode

Числовой код операции, соответствующий значениям opcode, перечисленным ниже, и значениям байткода в Коллекциях opcode.

opname

Прочесть имя операции

arg

Числовой аргумент операции (если есть), в противном случае None

argval

Рассчитанное значение аргумента (если известно), в противном случае совпадает с arg

argrepr

Человекопонятное описание аргумента операции

offset

Начальный индекс операции в последовательности байткода

starts_line

Строка, начатая этим opcode (если есть), в противном случае None

is_jump_target

True если другой код переходит сюда, в противном случае False

Новое в версии 3.4.

Компилятор Python в настоящее время генерирует следующие инструкции байткода.

Общие инструкции

NOP

Инструкция ничего не делает. Используется в качестве заполнителя оптимизатором байткода.

POP_TOP

Удаляет элемент из вершины стека (TOS).

ROT_TWO

Меняет местами два верхних элемента стека.

ROT_THREE

Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний элемент вниз на позицию три.

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

Помещает 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

Повторно поднимает исключение, которое в данный момент находится вверху стека. Если oparg не равен нулю, восстанавливает f_lasti текущего кадра до значения, при котором было поднято исключение.

Добавлена в версии 3.9.

WITH_EXCEPT_START

Вызывает функцию в позиции 7 на стеке с тремя верхними элементами стека в качестве аргументов. Используется для реализации вызова context_manager.__exit__(*exc_info()) при возникновении исключения в операторе with.

Добавлена в версии 3.9.

LOAD_ASSERTION_ERROR

Помещает AssertionError на стек. Используется оператором assert.

Добавлена в версии 3.9.

LOAD_BUILD_CLASS

Помещает builtins.__build_class__() на стек. Позже он вызывается оператором CALL_FUNCTION для создания класса.

SETUP_WITH(delta)

Этот оператор выполняет несколько операций перед началом блока with. Во-первых, он загружает __exit__() из менеджера контекста и помещает его на стек для последующего использования оператором WITH_EXCEPT_START. Затем, вызывается __enter__(), и блок finally, указывающий на delta, помещается на стек. Наконец, результат вызова метода __enter__() помещается на стек. Следующий оператор либо проигнорирует его (POP_TOP), либо сохранит его в (одной или нескольких) переменных (STORE_FAST, STORE_NAME или UNPACK_SEQUENCE).

Добавлена в версии 3.2.

COPY_DICT_WITHOUT_KEYS

TOS — кортеж ключей отображения, а TOS1 — объект-субъект соответствия. Заменить TOS на словарь, созданный из элементов TOS1, но без ключей из TOS.

Добавлена в версии 3.10.

GET_LEN

Поместить len(TOS) на стек.

Добавлена в версии 3.10.

MATCH_MAPPING

Если TOS является экземпляром collections.abc.Mapping (или, точнее: если в его tp_flags установлен флаг Py_TPFLAGS_MAPPING), поместить True на стек. В противном случае поместить False.

Добавлена в версии 3.10.

MATCH_SEQUENCE

Если TOS является экземпляром collections.abc.Sequence и не является экземпляром str/bytes/bytearray (или, точнее: если в его tp_flags установлен флаг Py_TPFLAGS_SEQUENCE), поместить True на стек. В противном случае поместить False.

Добавлена в версии 3.10.

MATCH_KEYS

TOS — кортеж ключей отображения, а TOS1 — объект-субъект соответствия. Если TOS1 содержит все ключи в TOS, поместить на стек кортеж, содержащий соответствующие значения, после True. В противном случае поместить None, после False.

Добавлена в версии 3.10.

Все следующие операторы используют свои аргументы.

END_OF_DOCUMENT_MARKER
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

Подобно 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.

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].

END_OF_DOCUMENT_MARKER
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)
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)

Изменено в версии 3.10: Значение флага 0x04 — кортеж строк вместо словаря

BUILD_SLICE(argc)

Выталкивает объект среза на стек. argc должен быть 2 или 3. Если 2, выталкивается slice(TOS1, TOS); если 3, выталкивается slice(TOS2, TOS1, TOS). См. встроенную функцию slice() для получения дополнительной информации.

EXTENDED_ARG(ext)

Префикс любого кода операции, имеющего аргумент, слишком большой, чтобы поместиться в стандартный один байт. ext содержит дополнительный байт, который действует как старшие биты аргумента. Для каждой операции максимум три префиксальных EXTENDED_ARG разрешены, формируя аргумент от двух до четырех байт.

FORMAT_VALUE(flags)

Используется для реализации форматированных строковых литералов (f-строк). Извлекает необязательный fmt_spec со стека, затем обязательный value. flags интерпретируется следующим образом:

  • (flags & 0x03) == 0x00: value форматируется как есть.
  • (flags & 0x03) == 0x01: вызывается str() над value перед его форматированием.
  • (flags & 0x03) == 0x01: вызывается 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. Если TOS2 является экземпляром TOS1 и имеет позиционные и именованные атрибуты, необходимые count и TOS, то TOS устанавливается в True, а TOS1 — в кортеж извлеченных атрибутов. В противном случае TOS устанавливается в False.

Добавлено в версии 3.10.

GEN_START(kind)

Извлекается TOS. Операнд kind соответствует типу генератора или корутины. Допустимые типы — 0 для генератора, 1 для корутины и 2 для асинхронного генератора.

Добавлено в версии 3.10.

ROT_N(count)

Поднимает верхние count элементов стека на одну позицию вверх и переносит TOS вниз на позицию count.

Добавлено в версии 3.10.

HAVE_ARGUMENT

Это не операция. Она определяет разделяющую черту между операциями, не использующими свой аргумент, и теми, которые используют (< HAVE_ARGUMENT и >= HAVE_ARGUMENT, соответственно).

Изменено в версии 3.6: Теперь каждый оператор имеет аргумент, но операторы < HAVE_ARGUMENT игнорируют его. Раньше аргумент имели только операторы >= HAVE_ARGUMENT.

Сборки кодов операций

Эти сборки предоставляются для автоматического анализа инструкций байткода:

dis.opname

Последовательность имён операций, индексируемых с помощью байткода.

dis.opmap

Словарь, сопоставляющий имена операций байткоду.

dis.cmp_op

Последовательность всех имён операций сравнения.

dis.hasconst

Последовательность байткодов, которые обращаются к константе.

dis.hasfree

Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «свободная» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области видимости. Она *не* включает ссылки на глобальные или встроенные области видимости).

dis.hasname

Последовательность байткодов, которые обращаются к атрибуту по имени.

dis.hasjrel

Последовательность байткодов, имеющих относительную цель перехода.

dis.hasjabs

Последовательность байткодов, имеющих абсолютную цель перехода.

dis.haslocal

Последовательность байткодов, которые обращаются к локальной переменной.

dis.hascompare

Последовательность байткодов логических операций.

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/dis.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API