Spec-Zone.ru › Python 3.8

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.

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

Удаляет элемент сверху стека.

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.

BEFORE_ASYNC_WITH

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

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

SETUP_ASYNC_WITH

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

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

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

PRINT_EXPR

Реализует оператор выражения для интерактивного режима. Элемент вершины стека удаляется и выводится на печать. В неинтерактивном режиме оператор выражения завершается с помощью 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: Значение словаря является элементом вершины стека, а ключ словаря — элементом следующего за ним элемента стека. Раньше порядок был обратным.

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

RETURN_VALUE

Возвращает значение из вершины стека вызывающему функции.

YIELD_VALUE

Извлекает элемент вершины стека и передаёт его как результат из генератора.

YIELD_FROM

Извлекает элемент вершины стека и делегирует его как под-итератор из генератора.

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

SETUP_ANNOTATIONS

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

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

IMPORT_STAR

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

POP_BLOCK

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

POP_EXCEPT

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

POP_FINALLY(preserve_tos)

Очищает стек значений и стек блоков. Если preserve_tos не 0, элемент вершины стека сначала извлекается и помещается в стек после выполнения других операций со стеком:

  • Если TOS — это NULL или целое число (помещённое в стек инструкцией BEGIN_FINALLY или CALL_FINALLY), оно удаляется из стека.
  • Если TOS — это тип исключения (помещённый в стек при возникновении исключения), из стека извлекаются 6 значений, а последние три извлечённых значения используются для восстановления состояния исключения. Блок обработчика исключений удаляется из стека блоков.

Она похожа на END_FINALLY, но не изменяет счётчик байткода и не вызывает исключение. Используется для реализации break, continue и return в блоке finally.

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

BEGIN_FINALLY

Помещает NULL в стек для использования в END_FINALLY, POP_FINALLY, WITH_CLEANUP_START и WITH_CLEANUP_FINISH. Начинает блок finally.

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

END_FINALLY

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

  • Если TOS — NULL (помещённый в стек BEGIN_FINALLY), продолжить с следующей инструкцией. TOS удаляется.
  • Если TOS — целое число (помещённое в стек CALL_FINALLY), устанавливает счётчик байткода на TOS. TOS удаляется.
  • Если TOS — тип исключения (помещённый в стек при возникновении исключения), из стека извлекаются 6 значений, первые три извлечённых значения используются для повторного возбуждения исключения, а последние три извлечённых значения используются для восстановления состояния исключения. Блок обработчика исключений удаляется из стека блоков.
LOAD_BUILD_CLASS

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

SETUP_WITH(delta)

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

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

WITH_CLEANUP_START

Начинает очистку стека при выходе из блока оператора with.

В верхней части стека находятся либо NULL (помещённый в стек BEGIN_FINALLY), либо 6 значений, помещённых в стек, если в блоке with возникло исключение. Ниже находится метод __exit__() или __aexit__() менеджера контекста.

Если TOS — NULL, вызывает SECOND(None, None, None), удаляет функцию из стека, оставляя TOS, и помещает None в стек. В противном случае вызывает SEVENTH(TOP, SECOND, THIRD), сдвигает нижние 3 значения в стеке вниз, заполняет пустую позицию NULL и помещает TOS. Наконец, помещает результат вызова в стек.

WITH_CLEANUP_FINISH

Завершает очистку стека при выходе из блока оператора with.

TOS — результат вызова функции __exit__() или __aexit__(), помещённый в стек WITH_CLEANUP_START. SECOND — None или тип исключения (помещённый в стек при возникновении исключения).

Удаляет два значения из стека. Если SECOND не None и TOS истинно, разворачивает блок EXCEPT_HANDLER, который был создан при перехвате исключения, и помещает NULL в стек.

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

STORE_NAME(namei)

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

END_OF_DOCUMENT_MARKER
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_FINALLY(delta)

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

CALL_FINALLY(delta)

Помещает адрес следующей инструкции на стек и увеличивает счётчик байткода на delta. Используется для вызова блока finally как «подпрограммы».

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

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

END_OF_DOCUMENT_MARKER
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 установлен, верхняя часть стека содержит объект отображения, содержащий дополнительные ключевые аргументы. Под ним находится объект-итерируемый, содержащий позиционные аргументы и вызываемый объект. 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/dis.html

Spec-Zone.ru

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