Объекты модулей
-
PyTypeObject PyModule_Type -
Часть Стабильной ABI.
Этот экземпляр
PyTypeObjectпредставляет тип Python-модуля. Он предоставляется программам Python какtypes.ModuleType.
-
int PyModule_Check(PyObject *p) -
Возвращает true, если p — это объект модуля или подтип объекта модуля. Эта функция всегда завершается успешно.
-
int PyModule_CheckExact(PyObject *p) -
Возвращает true, если p — это объект модуля, но не подтип
PyModule_Type. Эта функция всегда завершается успешно.
-
PyObject *PyModule_NewObject(PyObject *name) -
Значение возврата: новая ссылка. Часть Стабильной ABI с версии 3.7.
Возвращает новый объект модуля со свойством
__name__, установленным в name. Свойства модуля__name__,__doc__,__package__и__loader__заполняются (все кроме__name__установлены вNone); вызывающий код отвечает за предоставление свойства__file__.Возвращает
NULLпри ошибке.Добавлен в версии 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.
Возвращает объект словаря, реализующий пространство имен module; этот объект такой же, как свойство
__dict__объекта модуля. Если module не является объектом модуля (или подтипом объекта модуля), генерируетсяSystemErrorи возвращаетсяNULL.Рекомендуется, чтобы расширения использовали другие функции
PyModule_*иPyObject_*, а не напрямую работали со свойством__dict__модуля.
-
PyObject *PyModule_GetNameObject(PyObject *module) -
Значение возврата: новая ссылка. Часть Стабильной ABI с версии 3.7.
Возвращает значение
__name__для module. Если модуль не предоставляет его или это не строка, генерируется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__module. Если это свойство не определено или это не строка 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 -
Часть Стабильного ABI (включая все члены).
Структура определения модуля, которая содержит всю информацию, необходимую для создания объекта модуля. Обычно для каждого модуля существует только одна статически инициализированная переменная этого типа.
-
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 -
Функция обхода для вызова во время обхода GC объекта модуля или
NULL, если не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Это случается сразу после создания модуля и до выполнения модуля (функция
Py_mod_exec). Более точно, эта функция не вызывается, еслиm_sizeбольше 0 и состояние модуля (как возвращаетсяPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
inquiry m_clear -
Функция очистки для вызова во время очистки GC объекта модуля или
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) -
Значение возврата: Новая ссылка. Часть Стабильного ABI.
Создаёт новый объект модуля, используя определение в def, предполагая версию API module_api_version. Если эта версия не совпадает с версией интерпретатора, запускаемого в данный момент, генерируется
RuntimeWarning.Возвращает
NULLс установленным исключением в случае ошибки.Примечание
Большинство случаев использования этой функции должны использовать
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. -
-
Py_mod_exec -
Указывает функцию, вызываемую для выполнения модуля. Это эквивалентно выполнению кода модуля Python: как правило, эта функция добавляет классы и константы в модуль. Сигнатура функции:
-
int exec_module(PyObject *module)
Если указано несколько слотов
Py_mod_exec, они обрабатываются в порядке их появления в массиве m_slots. -
-
Py_mod_multiple_interpreters -
Указывает одно из следующих значений:
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED -
Модуль не поддерживает импорт в подмножества интерпретаторов.
-
Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED -
Модуль поддерживает импорт в подмножества интерпретаторов, но только когда они совместно используют основной интерпретатор GIL. (См. Изолирование модулей расширения.)
-
Py_MOD_PER_INTERPRETER_GIL_SUPPORTED -
Модуль поддерживает импорт в подмножества интерпретаторов, даже когда у них есть свой собственный GIL. (См. Изолирование модулей расширения.)
Этот слот определяет, произойдёт ли ошибка при импорте этого модуля в подмножество интерпретаторов.
Несколько слотов
Py_mod_multiple_interpretersне могут быть указаны в одном определении модуля.Если
Py_mod_multiple_interpretersне указан, механизм импорта использует значение по умолчаниюPy_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED.Добавлена в версии 3.12.
-
См. 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.Возвращает
NULLпри ошибке.Примечание
Большинство случаев использования этой функции должны использовать
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для получения подробной информации об отдельных записях (из-за отсутствия общего пространства имён модуля, функции уровня модуля, реализованные на С, обычно принимают модуль в качестве первого параметра, делая их похожими на методы экземпляров в классах 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.Возвращает
-1, если 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.
Возвращает
-1с установленным исключением при ошибке,0при успехе.Добавлена в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def) -
Часть Стабильной ABI с версии 3.3.
Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает
-1с установленным исключением при ошибке,0при успехе.Вызывающая сторона должна удерживать GIL.
Добавлена в версии 3.3.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/c-api/module.html