Spec-Zone.ru › Python 3.7

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

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

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

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

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

class dis.Instruction

Подробная информация об операции байткода

opcode

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

opname

Название операции в удобочитаемом формате

arg

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

argval

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

argrepr

Удобочитаемое описание аргумента операции

offset

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

starts_line

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

is_jump_target

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

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

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

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

NOP

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

POP_TOP

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

ROT_TWO

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

ROT_THREE

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

DUP_TOP

Дублирует ссылку вверху стека.

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

DUP_TOP_TWO

Дублирует две ссылки вверху стека, сохраняя их в том же порядке.

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

Унарные операции

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

UNARY_POSITIVE

Реализует TOS = +TOS.

UNARY_NEGATIVE

Реализует TOS = -TOS.

UNARY_NOT

Реализует TOS = not TOS.

UNARY_INVERT

Реализует TOS = ~TOS.

GET_ITER

Реализует TOS = iter(TOS).

GET_YIELD_FROM_ITER

Если TOS является объектом итератора генератора или корутины, он остается неизменным. В противном случае, реализует TOS = iter(TOS).

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

Бинарные операции

Бинарные операции удаляют верхний элемент стека (TOS) и второй верхний элемент стека (TOS1) со стека. Они выполняют операцию и возвращают результат обратно на стек.

BINARY_POWER

Реализует TOS = TOS1 ** TOS.

BINARY_MULTIPLY

Реализует TOS = TOS1 * TOS.

BINARY_MATRIX_MULTIPLY

Реализует TOS = TOS1 @ TOS.

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

BINARY_FLOOR_DIVIDE

Реализует TOS = TOS1 // TOS.

BINARY_TRUE_DIVIDE

Реализует TOS = TOS1 / TOS.

BINARY_MODULO

Реализует TOS = TOS1 % TOS.

BINARY_ADD

Реализует TOS = TOS1 + TOS.

BINARY_SUBTRACT

Реализует TOS = TOS1 - TOS.

BINARY_SUBSCR

Реализует TOS = TOS1[TOS].

BINARY_LSHIFT

Реализует TOS = TOS1 << TOS.

BINARY_RSHIFT

Реализует TOS = TOS1 >> TOS.

BINARY_AND

Реализует TOS = TOS1 & TOS.

BINARY_XOR

Реализует TOS = TOS1 ^ TOS.

BINARY_OR

Реализует TOS = TOS1 | TOS.

Операции на месте

Операции на месте похожи на бинарные операции, в том смысле, что они удаляют TOS и TOS1, и возвращают результат обратно на стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязательно) быть исходным TOS1.

INPLACE_POWER

Реализует операцию на месте TOS = TOS1 ** TOS.

INPLACE_MULTIPLY

Реализует операцию на месте TOS = TOS1 * TOS.

INPLACE_MATRIX_MULTIPLY

Реализует операцию на месте TOS = TOS1 @ TOS.

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

INPLACE_FLOOR_DIVIDE

Реализует операцию на месте TOS = TOS1 // TOS.

INPLACE_TRUE_DIVIDE

Реализует операцию на месте TOS = TOS1 / TOS.

INPLACE_MODULO

Реализует операцию на месте TOS = TOS1 % TOS.

INPLACE_ADD

Реализует операцию на месте TOS = TOS1 + TOS.

INPLACE_SUBTRACT

Реализует операцию на месте TOS = TOS1 - TOS.

INPLACE_LSHIFT

Реализует операцию на месте TOS = TOS1 << TOS.

INPLACE_RSHIFT

Реализует операцию на месте TOS = TOS1 >> TOS.

INPLACE_AND

Реализует операцию на месте TOS = TOS1 & TOS.

INPLACE_XOR

Реализует операцию на месте TOS = TOS1 ^ TOS.

INPLACE_OR

Реализует операцию на месте TOS = TOS1 | TOS.

STORE_SUBSCR

Реализует TOS1[TOS] = TOS2.

DELETE_SUBSCR

Реализует del TOS1[TOS].

Инструкции корутин

GET_AWAITABLE

Реализует TOS = get_awaitable(TOS), где get_awaitable(o) возвращает o если o является объектом корутины или объектом генератора со флагом CO_ITERABLE_COROUTINE, или решает o.__await__.

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

GET_AITER

Реализует TOS = TOS.__aiter__().

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

Изменено в версии 3.7: Возврат объектов awaitable из __aiter__ больше не поддерживается.

GET_ANEXT

Реализует PUSH(get_awaitable(TOS.__anext__())). Смотрите GET_AWAITABLE для подробностей о get_awaitable

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

END_OF_DOCUMENT_MARKER
BEFORE_ASYNC_WITH

Разрешает __aenter__ и __aexit__ из объекта в верхней части стека. Помещает __aexit__ и результат __aenter__() в стек.

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

SETUP_ASYNC_WITH

Создает новый объект фрейма.

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

Разные инструкции

PRINT_EXPR

Реализует оператор выражения для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме оператор выражения завершается с помощью POP_TOP.

BREAK_LOOP

Завершает цикл из-за оператора break.

CONTINUE_LOOP(target)

Продолжает цикл из-за оператора continue. target — адрес перехода (который должен быть инструкцией FOR_ITER).

SET_ADD(i)

Вызывает set.add(TOS1[-i], TOS). Используется для реализации множеств-генераторов.

LIST_APPEND(i)

Вызывает list.append(TOS[-i], TOS). Используется для реализации списков-генераторов.

MAP_ADD(i)

Вызывает dict.setitem(TOS1[-i], TOS, TOS1). Используется для реализации словарей-генераторов.

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

Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD объект контейнера остается в стеке после того, как добавленное значение или пара ключ/значение извлекаются, чтобы он был доступен для последующих итераций цикла.

RETURN_VALUE

Возвращает значение TOS вызывающей функции.

YIELD_VALUE

Извлекает TOS и возвращает его из генератора.

YIELD_FROM

Извлекает TOS и делегирует ему как подгенератору из генератора.

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

SETUP_ANNOTATIONS

Проверяет, определена ли __annotations__ в locals(). Если нет, устанавливает её со значением пустого dict. Эта инструкция генерируется только в том случае, если тело класса или модуля содержит статически заданные аннотации переменных.

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

IMPORT_STAR

Загружает все символы, не начинающиеся с '_' напрямую из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Эта инструкция реализует from module import *.

POP_BLOCK

Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, обозначающих вложенные циклы, операторы try и т. п.

POP_EXCEPT

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

END_FINALLY

Завершает предложение finally. Интерпретатор проверяет, нужно ли повторно поднять исключение или функция возвращает значение, и продолжает с внешним следующим блоком.

LOAD_BUILD_CLASS

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

SETUP_WITH(delta)

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

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

WITH_CLEANUP_START

Очищает стек при выходе из блока with. TOS — это метод __exit__() менеджера контекста. Под TOS находятся 1–3 значения, указывающие, как/почему был вызван блок finally:

  • SECOND = None
  • (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
  • SECOND = WHY_*; нет retval ниже него
  • (SECOND, THIRD, FOURTH) = exc_info()

В последнем случае вызывается TOS(SECOND, THIRD, FOURTH), в противном случае TOS(None, None, None). Помещает SECOND и результат вызова в стек.

WITH_CLEANUP_FINISH

Удаляет из стека тип исключения и результат вызова функции «exit».

Если стек представляет исключение и функция возвращает «истинное» значение, эта информация «удаляется» и заменяется единственным WHY_SILENCED, чтобы предотвратить повторное поднятие исключения инструкцией END_FINALLY. (Но нелокальныe переходы по-прежнему будут возобновлены.)

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

STORE_NAME(namei)

Реализует name = TOS. namei — индекс name в атрибуте co_names объекта кода. Компилятор пытается использовать STORE_FAST или STORE_GLOBAL, если это возможно.

DELETE_NAME(namei)

Реализует del name, где namei — индекс в атрибуте co_names объекта кода.

UNPACK_SEQUENCE(count)

Распаковывает TOS на отдельные значения count, которые помещаются в стек справа налево.

UNPACK_EX(counts)

Реализует присваивание со звёздочкой. Распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше, чем количество элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.

Низкий байт counts — это количество значений перед списком, высокий байт counts — количество значений после него. Полученные значения помещаются в стек справа налево.

STORE_ATTR(namei)

Реализует TOS.name = TOS1, где namei — индекс имени в co_names.

DELETE_ATTR(namei)

Реализует del TOS.name, используя namei в качестве индекса в co_names.

STORE_GLOBAL(namei)

Действует как STORE_NAME, но сохраняет имя как глобальное.

DELETE_GLOBAL(namei)

Действует как DELETE_NAME, но удаляет глобальное имя.

LOAD_CONST(consti)

Помещает co_consts[consti] в стек.

LOAD_NAME(namei)

Помещает значение, связанное с co_names[namei] в стек.

BUILD_TUPLE(count)

Создает кортеж, потребляя count элементов из стека, и помещает полученный кортеж в стек.

BUILD_LIST(count)

Действует как BUILD_TUPLE, но создает список.

BUILD_SET(count)

Действует как BUILD_TUPLE, но создаёт множество.

BUILD_MAP(count)

Помещает новый объект словаря в стек. Извлекает 2 * count элементов, чтобы словарь содержал count записей: {..., TOS3: TOS2, TOS1: TOS}.

Изменено в версии 3.5: Словарь создаётся из элементов стека вместо создания пустого словаря, предварительно размеченного для хранения count элементов.

BUILD_CONST_KEY_MAP(count)

Вариант BUILD_MAP, специализированный для постоянных ключей. Извлекает верхний элемент стека, содержащий кортеж ключей, затем, начиная с TOS1, извлекает count значений для формирования значений в созданном словаре.

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

BUILD_STRING(count)

Конкатенирует count строк из стека и помещает результирующую строку в стек.

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

BUILD_TUPLE_UNPACK(count)

Извлекает count итерируемых объектов из стека, объединяет их в один кортеж и помещает результат. Реализует распаковку итерируемых объектов в представления кортежей (*x, *y, *z).

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

BUILD_TUPLE_UNPACK_WITH_CALL(count)

Аналогично BUILD_TUPLE_UNPACK, но используется для f(*x, *y, *z) синтаксиса вызова. Элемент стека в позиции count + 1 должен быть соответствующим вызываемым объектом f.

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

BUILD_LIST_UNPACK(count)

Аналогично BUILD_TUPLE_UNPACK, но помещает список вместо кортежа. Реализует распаковку итерируемых объектов в представления списков [*x, *y, *z].

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

BUILD_SET_UNPACK(count)

Аналогично BUILD_TUPLE_UNPACK, но помещает множество вместо кортежа. Реализует распаковку итерируемых объектов в представления множеств {*x, *y, *z}.

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

BUILD_MAP_UNPACK(count)

Извлекает count отображений из стека, объединяет их в один словарь и помещает результат. Реализует распаковку словарей в представления словарей {**x, **y, **z}.

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

BUILD_MAP_UNPACK_WITH_CALL(count)

Аналогично BUILD_MAP_UNPACK, но используется для f(**x, **y, **z) синтаксиса вызова. Элемент стека в позиции count + 2 должен быть соответствующим вызываемым объектом f.

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

Изменено в версии 3.6: Позиция вызываемого объекта определяется добавлением 2 к аргументу инструкции, а не кодированием в втором байте аргумента.

LOAD_ATTR(namei)

Заменяет TOS на getattr(TOS, co_names[namei]).

COMPARE_OP(opname)

Выполняет булеву операцию. Имя операции можно найти в cmp_op[opname].

IMPORT_NAME(namei)

Импортирует модуль co_names[namei]. TOS и TOS1 извлекаются и предоставляют аргументы fromlist и level для __import__(). Объект модуля помещается в стек. Текущее пространство имён не затронуто: для правильной инструкции импорта последующая инструкция STORE_FAST изменяет пространство имён.

IMPORT_FROM(namei)

Загружает атрибут co_names[namei] из модуля, найденного в TOS. Результирующий объект помещается в стек для последующего сохранения с помощью инструкции STORE_FAST.

JUMP_FORWARD(delta)

Увеличивает счётчик байткода на delta.

POP_JUMP_IF_TRUE(target)

Если TOS истинно, устанавливает счётчик байткода на target. TOS извлекается.

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

POP_JUMP_IF_FALSE(target)

Если TOS ложно, устанавливает счётчик байткода на target. TOS извлекается.

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

JUMP_IF_TRUE_OR_POP(target)

Если TOS истинно, устанавливает счётчик байткода на target и оставляет TOS в стеке. В противном случае (TOS ложно), TOS извлекается.

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

JUMP_IF_FALSE_OR_POP(target)

Если TOS ложно, устанавливает счётчик байткода на target и оставляет TOS в стеке. В противном случае (TOS истинно), TOS извлекается.

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

JUMP_ABSOLUTE(target)

Устанавливает счётчик байткода на target.

FOR_ITER(delta)

TOS — итератор. Вызывается его метод __next__(). Если это возвращает новое значение, помещает его в стек (оставив итератор ниже). Если итератор указывает на исчерпание, TOS извлекается, а счётчик байткода увеличивается на delta.

LOAD_GLOBAL(namei)

Загружает глобальную переменную, именованную co_names[namei] в стек.

SETUP_LOOP(delta)

Помещает блок для цикла в стек блоков. Блок охватывает текущую инструкцию с размером delta байт.

SETUP_EXCEPT(delta)

Помещает блок try из try-except блока в стек блоков. delta указывает на первый блок except.

SETUP_FINALLY(delta)

Помещает блок try из try-except блока в стек блоков. delta указывает на блок finally.

LOAD_FAST(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек.

STORE_FAST(var_num)

Сохраняет TOS в локальную переменную co_varnames[var_num].

DELETE_FAST(var_num)

Удаляет локальную переменную co_varnames[var_num].

LOAD_CLOSURE(i)

Помещает ссылку на ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Имя переменной — co_cellvars[i] , если i меньше длины co_cellvars. В противном случае это co_freevars[i - len(co_cellvars)].

LOAD_DEREF(i)

Загружает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Помещает ссылку на объект, содержащийся в ячейке, в стек.

LOAD_CLASSDEREF(i)

Аналогично LOAD_DEREF, но сначала проверяет словарь локальных переменных, прежде чем обратиться к ячейке. Используется для загрузки свободных переменных в телах классов.

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

STORE_DEREF(i)

Сохраняет TOS в ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных.

DELETE_DEREF(i)

Очищает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Используется в инструкции del.

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

RAISE_VARARGS(argc)

Вызывает исключение, используя одну из 3 форм инструкции raise, в зависимости от значения argc:

  • 0: raise (повторное поднятие предыдущего исключения)
  • 1: raise TOS (вызов исключения экземпляра или типа в TOS)
  • 2: raise TOS1 from TOS (вызов исключения экземпляра или типа в TOS1 с __cause__ установленным в TOS)
END_OF_DOCUMENT_MARKER
CALL_FUNCTION(argc)

Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов. Вершина стека содержит позиционные аргументы, причём самый правый аргумент находится сверху. Под аргументами находится вызываемый объект. CALL_FUNCTION извлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта на стек.

Изменено в версии 3.6: Этот код операции используется только для вызовов с позиционными аргументами.

CALL_FUNCTION_KW(argc)

Вызывает вызываемый объект с позиционными (если есть) и именованными аргументами. argc указывает общее количество позиционных и именованных аргументов. Верхний элемент стека содержит кортеж имён именованных аргументов. Под ним находятся именованные аргументы в порядке, соответствующем кортежу. Под ними находятся позиционные аргументы, причём самый правый параметр находится сверху. Под аргументами находится вызываемый объект для вызова. CALL_FUNCTION_KW извлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта на стек.

Изменено в версии 3.6: Именованные аргументы упаковываются в кортеж вместо словаря, argc указывает общее количество аргументов.

CALL_FUNCTION_EX(flags)

Вызывает вызываемый объект с переменным набором позиционных и именованных аргументов. Если младший бит flags установлен, вершина стека содержит объект отображения, содержащий дополнительные именованные аргументы. Под ним находится итерируемый объект, содержащий позиционные аргументы и вызываемый объект. BUILD_MAP_UNPACK_WITH_CALL и BUILD_TUPLE_UNPACK_WITH_CALL могут использоваться для объединения нескольких объектов отображения и итерируемых объектов, содержащих аргументы. Перед вызовом вызываемого объекта объект отображения и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно. CALL_FUNCTION_EX извлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта на стек.

Введено в версии 3.6.

LOAD_METHOD(namei)

Загружает метод с именем co_names[namei] из объекта TOS. TOS извлекается. Этот байткод различает два случая: если у TOS есть метод с правильным именем, байткод помещает неувязанный метод и TOS. TOS будет использоваться в качестве первого аргумента (self) байткодом CALL_METHOD при вызове неувязанного метода. В противном случае NULL и возвращаемый объектом результат поиска атрибута помещаются на стек.

Введено в версии 3.7.

CALL_METHOD(argc)

Вызывает метод. argc — количество позиционных аргументов. Именованные аргументы не поддерживаются. Эта инструкция предназначена для использования с LOAD_METHOD. Позиционные аргументы находятся на вершине стека. Под ними на стеке находятся два элемента, описанные в LOAD_METHOD (либо self и объект неувязанного метода, либо NULL и произвольный вызываемый объект). Все они извлекаются, а возвращаемое значение помещается на стек.

Введено в версии 3.7.

MAKE_FUNCTION(flags)

Помещает новый объект функции на стек. Снизу вверх, потребляемые элементы стека должны состоять из значений, если аргумент несёт указанное значение флага:

  • 0x01 кортеж значений по умолчанию для позиционных-только и позиционных-или-именованных параметров в позиционном порядке
  • 0x02 словарь значений по умолчанию для именованных-только параметров
  • 0x04 словарь аннотаций
  • 0x08 кортеж, содержащий ячейки для свободных переменных, формирующий замыкание
  • код, связанный с функцией (в TOS1)
  • полное имя функции (в TOS)
BUILD_SLICE(argc)

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

EXTENDED_ARG(ext)

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

FORMAT_VALUE(flags)

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

  • (flags & 0x03) == 0x00: value форматируется как есть.
  • (flags & 0x03) == 0x01: вызывается str() для value перед форматированием.
  • (flags & 0x03) == 0x02: вызывается repr() для value перед форматированием.
  • (flags & 0x03) == 0x03: вызывается ascii() для value перед форматированием.
  • (flags & 0x04) == 0x04: извлекается fmt_spec со стека и используется, в противном случае используется пустой fmt_spec.

Форматирование выполняется с помощью PyObject_Format(). Результат помещается на стек.

Введено в версии 3.6.

HAVE_ARGUMENT

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

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

Сборки инструкций

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

dis.opname

Последовательность имён операций, индексируемая с использованием байткода.

dis.opmap

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

dis.cmp_op

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

dis.hasconst

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

dis.hasfree

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

dis.hasname

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

dis.hasjrel

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

dis.hasjabs

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

dis.haslocal

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

dis.hascompare

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

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

Spec-Zone.ru

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