Функциональные объекты

Есть несколько функций, специфичных для Python.

type PyFunctionObject

Структура языка C, используемая для функций.

PyTypeObject PyFunction_Type

Это экземпляр PyTypeObject, представляющий тип функции Python. Программистам Python он доступен как types.FunctionType.

int PyFunction_Check(PyObject *o)

Возвращает true, если o является объектом функции (имеет тип PyFunction_Type). Параметр не должен быть NULL. Эта функция всегда успешна.

PyObject *PyFunction_New(PyObject *code, PyObject *globals)
Возвращаемое значение: Новая ссылка.

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

Строка документа и имя функции извлекаются из объекта кода. Значение __module__ извлекается из globals. Для аргументов по умолчанию, аннотаций и закрытия устанавливается значение NULL. __qualname__ устанавливается в то же значение, что и поле co_qualname объекта кода.

PyObject *PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
Возвращаемое значение: Новая ссылка.

Как и PyFunction_New(), но также позволяет задать атрибут __qualname__ объекта функции. qualname должен быть объектом юникода или NULL; если NULL, то атрибут __qualname__ устанавливается в то же значение, что и поле co_qualname объекта кода.

Added in version 3.3.

PyObject *PyFunction_GetCode(PyObject *op)
Возвращаемое значение: Заимствованная ссылка.

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

PyObject *PyFunction_GetGlobals(PyObject *op)
Возвращаемое значение: Заимствованная ссылка.

Возвращает словарь globals, связанный с объектом функции op.

PyObject *PyFunction_GetModule(PyObject *op)
Возвращаемое значение: Заимствованная ссылка.

Возвращает borrowed reference атрибуту __module__ атрибута function object оп. Он может быть NULL.

Обычно это string, содержащий имя модуля, но код Python может установить его на любой другой объект.

PyObject *PyFunction_GetDefaults(PyObject *op)
Возвращаемое значение: Заимствованная ссылка.

Возвращает значения аргументов по умолчанию для объекта функции op. Это может быть кортеж аргументов или NULL.

int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)

Устанавливает значения аргументов по умолчанию для объекта функции op. defaults должно быть Py_None или кортежем.

Поднимает SystemError и возвращает -1 при неудаче.

void PyFunction_SetVectorcall(PyFunctionObject *func, vectorcallfunc vectorcall)

Устанавливает поле vectorcall данного объекта функции func.

Внимание: расширения, использующие этот API, должны сохранять поведение неизмененной (по умолчанию) функции vectorcall!

Added in version 3.12.

PyObject *PyFunction_GetClosure(PyObject *op)
Возвращаемое значение: Заимствованная ссылка.

Возвращает закрытие, связанное с объектом функции op. Это может быть NULL или кортеж объектов ячеек.

int PyFunction_SetClosure(PyObject *op, PyObject *closure)

Устанавливает закрытие, связанное с объектом функции op. closure должно быть Py_None или кортеж объектов ячеек.

Поднимает SystemError и возвращает -1 при неудаче.

PyObject *PyFunction_GetAnnotations(PyObject *op)
Возвращаемое значение: Заимствованная ссылка.

Возвращает аннотации объекта функции op. Это может быть изменяемый словарь или NULL.

int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)

Устанавливает аннотации для объекта функции op. Аннотации должны быть словарем или Py_None.

Поднимает SystemError и возвращает -1 при неудаче.

int PyFunction_AddWatcher(PyFunction_WatchCallback callback)

Зарегистрируйте callback в качестве наблюдателя функций для текущего интерпретатора. Возвращает идентификатор, который может быть передан в PyFunction_ClearWatcher(). В случае ошибки (например, нет больше доступных идентификаторов наблюдателя) верните -1 и установите исключение.

Added in version 3.12.

int PyFunction_ClearWatcher(int watcher_id)

Очистить наблюдателя, идентифицированного watcher_id, ранее возвращенного из PyFunction_AddWatcher() для текущего интерпретатора. Возвращает 0 в случае успеха, или -1 и устанавливает исключение в случае ошибки (например, если данный watcher_id никогда не был зарегистрирован).

Added in version 3.12.

type PyFunction_WatchEvent

Перечисление возможных событий наблюдателя функции: - PyFunction_EVENT_CREATE - PyFunction_EVENT_DESTROY - PyFunction_EVENT_MODIFY_CODE - PyFunction_EVENT_MODIFY_DEFAULTS - PyFunction_EVENT_MODIFY_KWDEFAULTS

Added in version 3.12.

typedef int (*PyFunction_WatchCallback)(PyFunction_WatchEvent event, PyFunctionObject *func, PyObject *new_value)

Тип функции обратного вызова наблюдателя функций.

Если event равно PyFunction_EVENT_CREATE или PyFunction_EVENT_DESTROY, то new_value будет равно NULL. В противном случае new_value будет содержать borrowed reference для нового значения, которое будет сохранено в func для изменяемого атрибута.

Обратный вызов может проверять, но не должен изменять func; это может привести к непредсказуемым последствиям, включая бесконечную рекурсию.

Если event - это PyFunction_EVENT_CREATE, то обратный вызов вызывается после полной инициализации func. В противном случае обратный вызов вызывается до модификации func, так что предыдущее состояние func может быть проверено. Времени выполнения разрешается оптимизировать создание объектов функций, если это возможно. В таких случаях событие не будет испускаться. Хотя это создает возможность заметного различия в поведении времени выполнения в зависимости от решений по оптимизации, это не меняет семантику выполняемого кода Python.

Если event имеет значение PyFunction_EVENT_DESTROY, взятие ссылки в обратном вызове функции, собирающейся быть уничтоженной, воскресит ее, предотвращая ее освобождение в это время. Когда воскрешенный объект будет уничтожен позже, все активные на тот момент обратные вызовы наблюдателя будут вызваны снова.

Если обратный вызов устанавливает исключение, он должен вернуть -1; это исключение будет выведено как нераскрываемое исключение с помощью PyErr_WriteUnraisable(). В противном случае он должен вернуть 0.

При входе в обратный вызов уже может быть установлено исключение. В этом случае обратный вызов должен вернуть 0 с тем же самым исключением, которое все еще установлено. Это означает, что обратный вызов не может вызывать другие API, которые могут установить исключение, если только он не сохранит и не очистит состояние исключения сначала, а затем восстановит его перед возвратом.

Added in version 3.12.