Объекты кода
Объекты кода — это низкоуровневая деталь реализации CPython. Каждый из них представляет собой фрагмент исполняемого кода, который ещё не был связан с функцией.
-
type PyCodeObject -
Структура C объектов, используемых для описания объектов кода. Поля этого типа могут измениться в любой момент.
-
PyTypeObject PyCode_Type -
Это экземпляр
PyTypeObject, представляющий объект кода Python.
-
int PyCode_Check(PyObject *co) -
Возвращает true, если co является объектом кода. Эта функция всегда завершается успешно.
-
Py_ssize_t PyCode_GetNumFree(PyCodeObject *co) -
Возвращает количество свободных переменных (переменных замыкания) в объекте кода.
-
int PyUnstable_Code_GetFirstFree(PyCodeObject *co) -
Это нестабильный API. Он может измениться без предупреждения в минорных выпусках.
Возвращает позицию первой свободной переменной (переменной замыкания) в объекте кода.
Изменено в версии 3.13: Переименована из
PyCode_GetFirstFreeв рамках нестабильного C API. Старое имя объявлено устаревшим, но останется доступным до следующего изменения сигнатуры.
-
PyCodeObject *PyUnstable_Code_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable) -
Это нестабильный API. Он может измениться без предупреждения в минорных выпусках.
Возвращает новый объект кода. Если вам нужен фиктивный объект кода для создания кадра, используйте вместо этого
PyCode_NewEmpty().Поскольку определение байт-кода часто меняется, прямой вызов
PyUnstable_Code_New()может привязать вас к конкретной версии Python.Многочисленные аргументы этой функции сложным образом зависят друг от друга, поэтому даже незначительные изменения значений могут привести к неправильному выполнению или сбоям виртуальной машины. Используйте эту функцию с предельной осторожностью.
Изменено в версии 3.11: Добавлены параметры
qualnameиexceptiontable.Изменено в версии 3.12: Переименована из
PyCode_Newв рамках нестабильного C API. Старое имя объявлено устаревшим, но останется доступным до следующего изменения сигнатуры.
-
PyCodeObject *PyUnstable_Code_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable) -
Это нестабильный API. Он может измениться без предупреждения в минорных выпусках.
Похожа на
PyUnstable_Code_New(), но принимает дополнительный аргумент «posonlyargcount» для позиционных аргументов, которые можно передавать только по позиции. К этой функции применимы те же предостережения, что и кPyUnstable_Code_New.Добавлена в версии 3.8: как
PyCode_NewWithPosOnlyArgsИзменено в версии 3.11: Добавлены параметры
qualnameиexceptiontable.Изменено в версии 3.12: Переименована в
PyUnstable_Code_NewWithPosOnlyArgs. Старое имя объявлено устаревшим, но останется доступным до следующего изменения сигнатуры.
-
PyCodeObject *PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) -
Возвращаемое значение: новая ссылка.
Возвращает новый пустой объект кода с указанными именем файла, именем функции и номером первой строки. При выполнении результирующий объект кода вызовет
Exception.
-
int PyCode_Addr2Line(PyCodeObject *co, int byte_offset) -
Возвращает номер строки инструкции, которая начинается в
byte_offsetили раньше и заканчивается после него. Если вам нужен только номер строки кадра, используйте вместо этогоPyFrame_GetLineNumber().Для эффективного перебора номеров строк в объекте кода используйте API, описанный в PEP 626.
-
int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column) -
Устанавливает значения переданных указателей
intв номера строки и столбца исходного кода для инструкции по адресуbyte_offset. Если для какого-либо элемента информация недоступна, устанавливает значение0.Возвращает
1в случае успеха и 0 в противном случае.Добавлена в версии 3.11.
-
PyObject *PyCode_GetCode(PyCodeObject *co) -
Эквивалентна коду Python
getattr(co, 'co_code'). Возвращает сильную ссылку наPyBytesObject, представляющий байт-код объекта кода. В случае ошибки возвращаетсяNULLи возбуждается исключение.Этот
PyBytesObjectможет создаваться интерпретатором по запросу и не обязательно представляет байт-код, фактически выполняемый CPython. Основное назначение этой функции — отладчики и профилировщики.Добавлена в версии 3.11.
-
PyObject *PyCode_GetVarnames(PyCodeObject *co) -
Эквивалентна коду Python
getattr(co, 'co_varnames'). Возвращает новую ссылку наPyTupleObject, содержащий имена локальных переменных. В случае ошибки возвращаетсяNULLи возбуждается исключение.Добавлена в версии 3.11.
-
PyObject *PyCode_GetCellvars(PyCodeObject *co) -
Эквивалентна коду Python
getattr(co, 'co_cellvars'). Возвращает новую ссылку наPyTupleObject, содержащий имена локальных переменных, на которые ссылаются вложенные функции. В случае ошибки возвращаетсяNULLи возбуждается исключение.Добавлена в версии 3.11.
-
PyObject *PyCode_GetFreevars(PyCodeObject *co) -
Эквивалентна коду Python
getattr(co, 'co_freevars'). Возвращает новую ссылку наPyTupleObject, содержащий имена свободных переменных (переменных замыкания). В случае ошибки возвращаетсяNULLи возбуждается исключение.Добавлена в версии 3.11.
-
int PyCode_AddWatcher(PyCode_WatchCallback callback) -
Регистрирует callback в качестве наблюдателя за объектами кода для текущего интерпретатора. Возвращает идентификатор, который можно передать в
PyCode_ClearWatcher(). В случае ошибки (например, если больше нет доступных идентификаторов наблюдателей) возвращает-1и устанавливает исключение.Добавлена в версии 3.12.
-
int PyCode_ClearWatcher(int watcher_id) -
Отключает наблюдателя с идентификатором watcher_id, ранее возвращённым функцией
PyCode_AddWatcher()для текущего интерпретатора. В случае успеха возвращает0, а в случае ошибки (например, если указанный watcher_id никогда не регистрировался) возвращает-1и устанавливает исключение.Добавлена в версии 3.12.
-
type PyCodeEvent -
Перечисление возможных событий наблюдателя за объектами кода: -
PY_CODE_EVENT_CREATE-PY_CODE_EVENT_DESTROYДобавлено в версии 3.12.
-
typedef int (*PyCode_WatchCallback)(PyCodeEvent event, PyCodeObject *co) -
Тип функции обратного вызова наблюдателя за объектами кода.
Если event — это
PY_CODE_EVENT_CREATE, функция обратного вызова вызывается после полной инициализации co. В противном случае функция обратного вызова вызывается до уничтожения co, поэтому можно проверить его предыдущее состояние.Если event — это
PY_CODE_EVENT_DESTROY, получение ссылки в функции обратного вызова на объект кода, который вскоре будет уничтожен, воскресит его и предотвратит его освобождение в этот момент. Когда воскресший объект будет уничтожен позднее, все активные на тот момент функции обратного вызова наблюдателей будут вызваны снова.Пользователям этого API не следует полагаться на внутренние детали реализации среды выполнения. К таким деталям могут относиться, помимо прочего, точный порядок и время создания и уничтожения объектов кода. Хотя изменения этих деталей могут приводить к различиям, наблюдаемым наблюдателями (в том числе к тому, будет ли вызвана функция обратного вызова), семантика выполняемого кода Python при этом не меняется.
Если функция обратного вызова устанавливает исключение, она должна вернуть
-1; это исключение будет выведено как необрабатываемое с помощьюPyErr_WriteUnraisable(). В противном случае она должна вернуть0.При входе в функцию обратного вызова уже может быть установлено ожидающее исключение. В этом случае функция обратного вызова должна вернуть
0, оставив то же исключение установленным. Это означает, что функция обратного вызова не может вызывать другие API, способные установить исключение, если только она предварительно не сохранит и не очистит состояние исключения, а затем не восстановит его перед возвратом.Добавлено в версии 3.12.
-
PyObject *PyCode_Optimize(PyObject *code, PyObject *consts, PyObject *names, PyObject *lnotab_obj) -
Эта функция ничего не делает.
До Python 3.10 эта функция выполняла базовые оптимизации объекта кода.
Изменено в версии 3.10: Теперь эта функция ничего не делает.
Мягко объявлена устаревшей начиная с версии 3.13.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/code.html