Spec-Zone.ru › Python 3.9

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

  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_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() вернёт эффект стека при переходе. Если jump False, он вернёт эффект стека при отсутствии перехода. И если jump None (по умолчанию), он вернёт максимальный эффект стека в обоих случаях.

Введено в версии 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, но создаёт множество.

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

Spec-Zone.ru

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