Модульные объекты
-
PyTypeObject PyModule_Type -
Часть Стабильной ABI.
Этот экземпляр
PyTypeObjectпредставляет тип Python-модуля. Он предоставляется программам Python какtypes.ModuleType.
-
int PyModule_Check(PyObject *p) -
Возвращает истину, если p — объект модуля или подтип объекта модуля. Эта функция всегда успешна.
-
int PyModule_CheckExact(PyObject *p) -
Возвращает истину, если p — объект модуля, но не подтип
PyModule_Type. Эта функция всегда успешна.
-
PyObject *PyModule_NewObject(PyObject *name) -
Значение возврата: Новая ссылка. Часть Стабильной ABI с версии 3.7.
Возвращает новый объект модуля с атрибутом
__name__, установленным в name. Атрибуты модуля__name__,__doc__,__package__и__loader__заполняются (все кроме__name__устанавливаются вNone); вызывающий код отвечает за предоставление атрибута__file__.Введено в версии 3.3.
Изменено в версии 3.4:
__package__и__loader__устанавливаются вNone.
-
PyObject *PyModule_New(const char *name) -
Значение возврата: Новая ссылка. Часть Стабильной ABI.
Аналогично
PyModule_NewObject(), но имя — строка в кодировке UTF-8 вместо объекта Unicode.
-
PyObject *PyModule_GetDict(PyObject *module) -
Значение возврата: Заимствованная ссылка. Часть Стабильной ABI.
Возвращает словарь, реализующий пространство имен модуля; этот объект такой же, как атрибут
__dict__объекта модуля. Если module не является объектом модуля (или подтипом объекта модуля), возбуждаетсяSystemError, и возвращаетсяNULL.Рекомендуется, чтобы расширения использовали другие функции
PyModule_*иPyObject_*, а не непосредственно манипулировали атрибутом__dict__модуля.
-
PyObject *PyModule_GetNameObject(PyObject *module) -
Значение возврата: Новая ссылка. Часть Стабильной ABI с версии 3.7.
Возвращает значение
__name__модуля. Если модуль его не предоставляет или оно не является строкой, возбуждаетсяSystemErrorи возвращаетсяNULL.Введено в версии 3.3.
-
const char *PyModule_GetName(PyObject *module) -
Часть Стабильной ABI.
Аналогично
PyModule_GetNameObject(), но возвращает имя в кодировке'utf-8'.
-
void *PyModule_GetState(PyObject *module) -
Часть Стабильной ABI.
Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный при создании модуля, или
NULL. См.PyModuleDef.m_size.
-
PyModuleDef *PyModule_GetDef(PyObject *module) -
Часть Стабильной ABI.
Возвращает указатель на структуру
PyModuleDef, из которой был создан модуль, илиNULLесли модуль не был создан из определения.
-
PyObject *PyModule_GetFilenameObject(PyObject *module) -
Значение возврата: Новая ссылка. Часть Стабильной ABI.
Возвращает имя файла, из которого загружен module, используя атрибут
__file__модуля. Если он не определен или не является строкой Unicode, возбуждаетсяSystemErrorи возвращаетсяNULL; в противном случае возвращается ссылка на объект Unicode.Введено в версии 3.2.
-
const char *PyModule_GetFilename(PyObject *module) -
Часть Стабильной ABI.
Аналогично
PyModule_GetFilenameObject(), но возвращает имя файла в кодировке ‘utf-8’.Устарело начиная с версии 3.2:
PyModule_GetFilename()возбуждаетUnicodeEncodeErrorдля некодируемых имен файлов; используйтеPyModule_GetFilenameObject()вместо этого.
Инициализация модулей C
Объекты модулей обычно создаются из модулей расширения (динамических библиотек, которые экспортируют функцию инициализации) или встроенных модулей (где функция инициализации добавляется с помощью PyImport_AppendInittab()). См. Создание расширений C и C++ или Расширение встраиваемого Python для получения подробной информации.
Функция инициализации может либо передать экземпляр определения модуля в PyModule_Create() и вернуть получившийся объект модуля, либо запросить «многофазную инициализацию», вернув саму структуру определения.
-
type PyModuleDef -
Часть Стабильного API (включая все члены).
Структура определения модуля, которая содержит всю информацию, необходимую для создания объекта модуля. Обычно для каждого модуля существует только одна статически инициализированная переменная этого типа.
-
PyModuleDef_Base m_base -
Всегда инициализируйте этот член значением
PyModuleDef_HEAD_INIT.
-
const char *m_name -
Имя нового модуля.
-
const char *m_doc -
Документация модуля; обычно используется строковая переменная документации, созданная с помощью
PyDoc_STRVAR.
-
Py_ssize_t m_size -
Состояние модуля может храниться в области памяти, привязанной к модулю, которая может быть получена с помощью
PyModule_GetState(), а не в статических глобальных переменных. Это делает модули безопасными для использования в нескольких подинтерпретаторах.Эта область памяти выделяется на основе m_size при создании модуля и освобождается при удалении объекта модуля после того, как вызвана функция
m_free, если она присутствует.Установка
m_sizeв-1означает, что модуль не поддерживает подинтерпретаторы, так как он имеет глобальное состояние.Установка значения, отличного от отрицательного, означает, что модуль может быть повторно инициализирован и указывает на дополнительный объем памяти, необходимый для его состояния. Неотрицательное значение
m_sizeтребуется для многофазной инициализации.См. PEP 3121 для получения более подробной информации.
-
PyMethodDef *m_methods -
Указатель на таблицу функций уровня модуля, описанных значениями
PyMethodDef. Может бытьNULLв случае отсутствия функций.
-
PyModuleDef_Slot *m_slots -
Массив определений слотов для многофазной инициализации, завершающийся записью
{0, NULL}. При использовании однофазной инициализации m_slots должен бытьNULL.Изменено в версии 3.5: До версии 3.5 этот член всегда устанавливался в
NULL, и был определен как:-
inquiry m_reload
-
-
traverseproc m_traverse -
Функция обхода для вызова во время обхода объекта модуля сборщиком мусора, или
NULLесли не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и перед выполнением модуля (
Py_mod_execфункция). Точнее, эта функция не вызывается, еслиm_sizeбольше 0 и состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается перед выделением состояния модуля.
-
inquiry m_clear -
Функция очистки для вызова во время очистки объекта модуля сборщиком мусора, или
NULLесли не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и перед выполнением модуля (
Py_mod_execфункция). Точнее, эта функция не вызывается, еслиm_sizeбольше 0 и состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Как и
PyTypeObject.tp_clear, эта функция не всегда вызывается перед удалением модуля. Например, когда подсчёт ссылок достаточно для определения того, что объект больше не используется, циклический сборщик мусора не участвует, и функцияm_freeвызывается напрямую.Изменено в версии 3.9: Больше не вызывается перед выделением состояния модуля.
-
freefunc m_free -
Функция для вызова при удалении объекта модуля, или
NULLесли не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Это происходит сразу после создания модуля и перед выполнением модуля (
Py_mod_execфункция). Точнее, эта функция не вызывается, еслиm_sizeбольше 0 и состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается перед выделением состояния модуля.
-
Однофазная инициализация
Функция инициализации модуля может создать и вернуть объект модуля напрямую. Это называется «однофазной инициализацией» и использует одну из следующих двух функций создания модулей:
-
PyObject *PyModule_Create(PyModuleDef *def) -
Значение возврата: Новый ссылка.
Создаёт новый объект модуля, задавая определение в def. Это эквивалентно
PyModule_Create2()с module_api_version, установленным наPYTHON_API_VERSION.
-
PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version) -
Значение возврата: Новый ссылка. Часть Стабильного API.
Создаёт новый объект модуля, задавая определение в def, предполагая версию API module_api_version. Если эта версия не совпадает с версией работающего интерпретатора, выводится предупреждение
RuntimeWarning.Примечание
Большинство случаев использования этой функции должны использовать
PyModule_Create()вместо неё; используйте только эту, если вы уверены, что вам это нужно.
Перед возвратом из функции инициализации, получившийся объект модуля обычно заполняется с помощью функций, таких как PyModule_AddObjectRef().
Многофазная инициализация
Альтернативный способ указания расширений — запрос «многофазной инициализации». Модули расширений, созданные таким образом, ведут себя более как модули Python: инициализация разделена между фазой создания, когда создается объект модуля, и фазой выполнения, когда он заполняется. Различие аналогично методам __new__() и __init__() классов.
В отличие от модулей, созданных с использованием однофазной инициализации, эти модули не являются синглетонами: если запись в sys.modules удаляется, а модуль повторно импортируется, создается новый объект модуля, а старый модуль подвергается стандартному сбору мусора — как и в случае с модулями Python. По умолчанию несколько модулей, созданных по одному определению, должны быть независимыми: изменения в одном не должны влиять на другие. Это означает, что все состояние должно быть специфичным для объекта модуля (например, с использованием PyModule_GetState()) или его содержимого (например, __dict__ модуля или отдельных классов, созданных с помощью PyType_FromSpec()).
Ожидается, что все модули, созданные с использованием многофазной инициализации, поддерживают поддержку под-интерпретаторов. Обеспечение независимости нескольких модулей, как правило, достаточно для достижения этого.
Для запроса многофазной инициализации функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef с непустым m_slots. Перед возвратом экземпляр PyModuleDef должен быть инициализирован следующей функцией:
-
PyObject *PyModuleDef_Init(PyModuleDef *def) -
Значение возврата: Заимствованная ссылка. Часть Стабильной ABI с версии 3.5.
Обеспечивает, что определение модуля является правильно инициализированным объектом Python, который корректно сообщает свой тип и счетчик ссылок.
Возвращает def, преобразованный в
PyObject*, илиNULL, если произошла ошибка.Введено в версии 3.5.
Член m_slots определения модуля должен указывать на массив структур PyModuleDef_Slot:
-
type PyModuleDef_Slot -
-
int slot -
Идентификатор слота, выбранный из доступных значений, объясненных ниже.
-
void *value -
Значение слота, смысл которого зависит от идентификатора слота.
Введено в версии 3.5.
-
Массив m_slots должен завершаться слотом с идентификатором 0.
Доступные типы слотов:
-
Py_mod_create -
Указывает функцию, которая вызывается для создания самого объекта модуля. Указатель value этого слота должен указывать на функцию с сигнатурой:
- PyObject *create_module(PyObject *spec, PyModuleDef *def)
Функция получает экземпляр
ModuleSpec, как определено в PEP 451, и определение модуля. Она должна возвращать новый объект модуля или установить ошибку и вернутьNULL.Эта функция должна быть минимальной. В частности, она не должна вызывать произвольный Python-код, так как попытка повторного импорта того же модуля может привести к бесконечной петле.
Несколько
Py_mod_createслотов не могут быть указаны в одном определении модуля.Если
Py_mod_createне указан, механизм импорта создаст обычный объект модуля с помощьюPyModule_New(). Имя берется из spec, а не из определения, что позволяет модулям расширений динамически подстраиваться под их место в иерархии модулей и импортироваться под разными именами через символические ссылки, при этом используя одно определение модуля.Нет требования, чтобы возвращаемый объект был экземпляром
PyModule_Type. Может быть использован любой тип, если он поддерживает установку и получение атрибутов, связанных с импортом. Однако только экземплярыPyModule_Typeмогут быть возвращены, если уPyModuleDefесть не-NULLm_traverse,m_clear,m_free; не нулевыеm_size; или слоты, отличные отPy_mod_create. - PyObject *create_module(PyObject *spec, PyModuleDef *def)
-
Py_mod_exec -
Указывает функцию, которая вызывается для выполнения модуля. Это эквивалентно выполнению кода модуля Python: обычно эта функция добавляет классы и константы в модуль. Подпись функции:
- int exec_module(PyObject *module)
Если указано несколько
Py_mod_execслотов, они обрабатываются в порядке их появления в массиве m_slots. - int exec_module(PyObject *module)
См. PEP 489 для получения более подробной информации о многофазной инициализации.
Функции низкоуровневого создания модулей
Следующие функции вызываются в фоновом режиме при использовании многофазной инициализации. Их можно использовать непосредственно, например, при динамическом создании объектов модулей. Обратите внимание, что для полной инициализации модуля необходимо вызвать как PyModule_FromDefAndSpec, так и PyModule_ExecDef.
-
PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec) -
Значение возврата: Новая ссылка.
Создает новый объект модуля, используя определение в def и ModuleSpec spec. Это поведение аналогично
PyModule_FromDefAndSpec2()с параметром module_api_version, установленным в значениеPYTHON_API_VERSION.Добавлена в версии 3.5.
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version) -
Значение возврата: Новая ссылка. Часть Стабильной ABI с версии 3.7.
Создает новый объект модуля, используя определение в def и ModuleSpec spec, предполагая версию API module_api_version. Если эта версия не соответствует версии работающего интерпретатора, генерируется
RuntimeWarning.Примечание
Большинство случаев использования этой функции должны использовать
PyModule_FromDefAndSpec(); используйте эту функцию только если вы уверены, что вам это нужно.Добавлена в версии 3.5.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def) -
Часть Стабильной ABI с версии 3.7.
Обрабатывает все слоты выполнения (
Py_mod_exec), указанные в def.Добавлена в версии 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring) -
Часть Стабильной ABI с версии 3.7.
Устанавливает строку документации для module в docstring. Эта функция вызывается автоматически при создании модуля из
PyModuleDef, используя либоPyModule_Create, либоPyModule_FromDefAndSpec.Добавлена в версии 3.5.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions) -
Часть Стабильной ABI с версии 3.7.
Добавляет функции из массива functions, завершённого
NULL, в module. Для получения подробной информации о содержимом отдельных элементов обратитесь к документацииPyMethodDef(из-за отсутствия общего пространства имён модуля, функции уровня модуля, реализованные на C, обычно получают модуль в качестве своего первого параметра, делая их похожими на методы экземпляров в Python-классах). Эта функция вызывается автоматически при создании модуля изPyModuleDef, используя либоPyModule_Create, либоPyModule_FromDefAndSpec.Добавлена в версии 3.5.
Вспомогательные функции
Функция инициализации модуля (если используется однофазная инициализация) или функция, вызываемая из слота выполнения модуля (если используется многофазная инициализация), может использовать следующие функции для помощи в инициализации состояния модуля:
-
int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value) -
Часть Стабильной ABI с версии 3.10.
Добавляет объект в module под именем name. Это удобная функция, которую можно использовать из функции инициализации модуля.
В случае успеха возвращает
0. В случае ошибки генерирует исключение и возвращает-1.Возвращает
NULL, если value равноNULL. В этом случае необходимо вызвать функцию с поднятым исключением.Пример использования:
static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); if (obj == NULL) { return -1; } int res = PyModule_AddObjectRef(module, "spam", obj); Py_DECREF(obj); return res; }Пример также можно записать, не проверяя явно, является ли obj
NULL:static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); int res = PyModule_AddObjectRef(module, "spam", obj); Py_XDECREF(obj); return res; }Обратите внимание, что в этом случае следует использовать
Py_XDECREF(), а неPy_DECREF(), так как obj может бытьNULL.Добавлена в версии 3.10.
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) -
Часть Стабильной ABI.
Аналогично
PyModule_AddObjectRef(), но при успехе заимствует ссылку на value (если возвращает0).Рекомендуется использовать новую функцию
PyModule_AddObjectRef(), так как при неправильном использовании функцииPyModule_AddObject()легко допустить утечку ссылок.Примечание
В отличие от других функций, заимствующих ссылки,
PyModule_AddObject()освобождает ссылку на value только при успешном выполнении.Это означает, что необходимо проверять значение возврата, и в случае ошибки код должен вручную вызвать
Py_DECREF()value.Пример использования:
static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); if (obj == NULL) { return -1; } if (PyModule_AddObject(module, "spam", obj) < 0) { Py_DECREF(obj); return -1; } // PyModule_AddObject() stole a reference to obj: // Py_DECREF(obj) is not needed here return 0; }Пример также можно записать, не проверяя явно, является ли obj
NULL:static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); if (PyModule_AddObject(module, "spam", obj) < 0) { Py_XDECREF(obj); return -1; } // PyModule_AddObject() stole a reference to obj: // Py_DECREF(obj) is not needed here return 0; }Обратите внимание, что в этом случае следует использовать
Py_XDECREF(), а неPy_DECREF(), так как obj может бытьNULL.
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value) -
Часть Стабильной ABI.
Добавляет целочисленную константу в module под именем name. Эта вспомогательная функция может использоваться из функции инициализации модуля. Возвращает
-1в случае ошибки,0в случае успеха.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) -
Часть Стабильной ABI.
Добавляет строковую константу в module под именем name. Эта вспомогательная функция может использоваться из функции инициализации модуля. Строка value должна быть
NULL-завершённой. Возвращает-1в случае ошибки,0в случае успеха.
-
PyModule_AddIntMacro(module, macro) -
Добавляет целочисленную константу в module. Имя и значение берутся из macro. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет целочисленную константу AF_INET со значением AF_INET в module. Возвращает-1в случае ошибки,0в случае успеха.
-
PyModule_AddStringMacro(module, macro) -
Добавляет строковую константу в module.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type) -
Часть Стабильной ABI с версии 3.10.
Добавляет объект типа в module. Объект типа окончательно формируется путем внутреннего вызова
PyType_Ready(). Имя объекта типа берется из последнего компонентаtp_nameпосле точки. Возвращает-1в случае ошибки,0в случае успеха.Добавлена в версии 3.9.
Поиск модуля
Однофазная инициализация создает модули-синглтоны, которые можно искать в контексте текущего интерпретатора. Это позволяет получить объект модуля позже, используя только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с использованием многофазной инициализации, так как из одного определения могут быть созданы несколько таких модулей.
-
PyObject *PyState_FindModule(PyModuleDef *def) -
Значение возврата: Заимствованная ссылка. Часть Стабильной ABI.
Возвращает объект модуля, созданный из def для текущего интерпретатора. Этот метод требует, чтобы объект модуля был присоединён к состоянию интерпретатора с помощью
PyState_AddModule()предварительно. В случае, если соответствующий объект модуля не найден или ещё не присоединён к состоянию интерпретатора, он возвращаетNULL.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def) -
Часть Стабильной ABI с версии 3.3.
Присоединяет объект модуля, переданный в функцию, к состоянию интерпретатора. Это позволяет получить доступ к объекту модуля через
PyState_FindModule().Эффективно только для модулей, созданных с использованием однофазной инициализации.
Python вызывает
PyState_AddModuleавтоматически после импорта модуля, поэтому вызывать его из кода инициализации модуля не нужно (но это безопасно). Явное обращение необходимо только в том случае, если собственный код инициализации модуля впоследствии вызываетPyState_FindModule. Функция предназначена в основном для реализации альтернативных механизмов импорта (либо вызывая её напрямую, либо обращаясь к её реализации для получения подробностей о необходимых обновлениях состояния).Вызывающая сторона должна удерживать GIL.
Возвращает 0 при успехе или -1 при ошибке.
Введено в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def) -
Часть Стабильной ABI с версии 3.3.
Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает 0 при успехе или -1 при ошибке.
Вызывающая сторона должна удерживать GIL.
Введено в версии 3.3.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/c-api/module.html