Объекты модулей
-
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.
Возвращает объект словаря, реализующий пространство имен 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 -
Строка документации модуля; обычно используется переменная docstring, созданная с помощью
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) -
Значение возврата: Новая ссылка. Часть Стабильной ABI.
Создает новый объект модуля, используя определение в 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. -
-
Py_mod_exec -
Указывает функцию, которая вызывается для выполнения модуля. Это эквивалентно выполнению кода модуля Python: обычно эта функция добавляет классы и константы в модуль. Подпись функции:
-
int exec_module(PyObject *module)
Если указано несколько слотов
Py_mod_exec, они обрабатываются в порядке появления в массиве m_slots. -
См. 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.
Добавляет объект в модуль под именем 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.
Добавляет целочисленную константу в модуль под именем name. Эту вспомогательную функцию можно использовать из функции инициализации модуля. Возвращает
-1при ошибке,0при успехе.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) -
Часть Стабильной ABI.
Добавляет строковую константу в модуль под именем name. Эту вспомогательную функцию можно использовать из функции инициализации модуля. Строка value должна быть
NULL-завершённой. Возвращает-1при ошибке,0при успехе.
-
int PyModule_AddIntMacro(PyObject *module, macro) -
Добавляет целочисленную константу в модуль. Имя и значение берутся из macro. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет целочисленную константу AF_INET со значением AF_INET в модуль. Возвращает-1при ошибке,0при успехе.
-
int PyModule_AddStringMacro(PyObject *module, macro) -
Добавляет строковую константу в модуль.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type) -
Часть Стабильной ABI с версии 3.10.
Добавляет объект типа в модуль. Объект типа завершается вызовом внутренней функции
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.10/c-api/module.html