Объекты модулей
-
PyTypeObject PyModule_Type -
Этот экземпляр
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) -
Возвращаемое значение: Новая ссылка.
Возвращает новый объект модуля с атрибутом
__name__, установленным на name. Атрибуты модуля__name__,__doc__,__package__и__loader__заполняются (все, кроме__name__, устанавливаются наNone); вызывающий код отвечает за предоставление атрибута__file__.Введено в версии 3.3.
Изменено в версии 3.4:
__package__и__loader__устанавливаются наNone.
-
PyObject* PyModule_New(const char *name) -
Возвращаемое значение: Новая ссылка.
Аналогично
PyModule_NewObject(), но имя является строкой в кодировке UTF-8, а не объектом Unicode.
-
PyObject* PyModule_GetDict(PyObject *module) -
Возвращаемое значение: Заимствованная ссылка.
Возвращает объект словаря, реализующий пространство имён module; этот объект такой же, как атрибут
__dict__объекта модуля. Если module не является объектом модуля (или подтипом объекта модуля), возникает исключениеSystemErrorи возвращаетсяNULL.Рекомендуется, чтобы расширения использовали другие функции
PyModule_*()иPyObject_*()вместо непосредственного манипулирования атрибутом__dict__модуля.
-
PyObject* PyModule_GetNameObject(PyObject *module) -
Возвращаемое значение: Новая ссылка.
Возвращает значение
__name__модуля module. Если модуль не предоставляет значение или оно не является строкой, возникает исключениеSystemErrorи возвращаетсяNULL.Введено в версии 3.3.
-
const char* PyModule_GetName(PyObject *module) -
Аналогично
PyModule_GetNameObject(), но возвращает имя, закодированное в'utf-8'.
-
void* PyModule_GetState(PyObject *module) -
Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный во время создания модуля, или
NULL. См.PyModuleDef.m_size.
-
PyModuleDef* PyModule_GetDef(PyObject *module) -
Возвращает указатель на структуру
PyModuleDef, с помощью которой был создан модуль, илиNULLесли модуль не был создан с помощью определения.
-
PyObject* PyModule_GetFilenameObject(PyObject *module) -
Возвращаемое значение: Новая ссылка.
Возвращает имя файла, из которого был загружен module, используя атрибут
__file__module. Если этот атрибут не определён или не является строкой Unicode, возбуждается исключениеSystemErrorи возвращаетсяNULL; в противном случае возвращается ссылка на объект Unicode.Введено в версии 3.2.
-
const char* PyModule_GetFilename(PyObject *module) -
Аналогично
PyModule_GetFilenameObject(), но возвращает имя файла, закодированное в ‘utf-8’.Устарело начиная с версии 3.2:
PyModule_GetFilename()вызывает исключениеUnicodeEncodeErrorдля имён файлов, которые невозможно закодировать. ИспользуйтеPyModule_GetFilenameObject()вместо этого.
Инициализация модулей C
Объекты модулей обычно создаются из модулей расширения (динамических библиотек, экспортирующих функцию инициализации) или встроенных модулей (где функция инициализации добавляется с помощью PyImport_AppendInittab()). Подробности см. в Создание расширений на C и C++ или Расширение встроенного Python.
Функция инициализации может либо передать экземпляр определения модуля в PyModule_Create() и вернуть полученный объект модуля, либо запросить «инициализацию в несколько этапов», вернув саму структуру определения.
-
PyModuleDef -
Структура определения модуля, содержащая всю необходимую информацию для создания объекта модуля. Обычно для каждого модуля существует только одна статически инициализированная переменная этого типа.
-
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если не нужна. Эта функция может быть вызвана до выделения состояния модуля (PyModule_GetState()может вернутьNULL) и до выполнения функцииPy_mod_exec.
-
inquiry m_clear -
Функция очистки для вызова во время очистки GC объекта модуля, или
NULLесли не нужна. Эта функция может быть вызвана до выделения состояния модуля (PyModule_GetState()может вернутьNULL) и до выполнения функцииPy_mod_exec.
-
freefunc m_free -
Функция для вызова при удалении объекта модуля, или
NULLесли не нужна. Эта функция может быть вызвана до выделения состояния модуля (PyModule_GetState()может вернутьNULL) и до выполнения функцииPy_mod_exec.
-
Одноэтапная инициализация
Функция инициализации модуля может создать и вернуть объект модуля напрямую. Это называется «одноэтапной инициализацией» и использует одну из следующих двух функций создания модуля:
-
PyObject* PyModule_Create(PyModuleDef *def) -
Значение возврата: новая ссылка.
Создает новый объект модуля, исходя из определения в def. Это эквивалентно
PyModule_Create2()с module_api_version, установленным вPYTHON_API_VERSION.
-
PyObject* PyModule_Create2(PyModuleDef *def, int module_api_version) -
Значение возврата: новая ссылка.
Создает новый объект модуля, исходя из определения в def, предполагая версию API module_api_version. Если эта версия не совпадает с версией работающего интерпретатора, генерируется
RuntimeWarning.Примечание
Большинство случаев использования этой функции должны использовать
PyModule_Create()вместо неё; используйте эту функцию только если вы уверены, что вам это нужно.
Перед возвращением из функции инициализации, полученный объект модуля обычно заполняется с помощью функций, таких как PyModule_AddObject().
Инициализация в несколько фаз
Альтернативный способ указания расширений — запрос «инициализации в несколько фаз». Модули расширений, созданные таким образом, ведут себя более как модули Python: инициализация разделена между фазой создания, когда создаётся объект модуля, и фазой выполнения, когда он заполняется. Различие аналогично методам __new__() и __init__() классов.
В отличие от модулей, созданных с использованием однофазной инициализации, эти модули не являются одиночками: если запись в sys.modules удаляется, а модуль повторно импортируется, создаётся новый объект модуля, а старый модуль подвергается стандартному сбору мусора — как и в случае с модулями Python. По умолчанию несколько модулей, созданных по одному определению, должны быть независимыми: изменения в одном не должны влиять на другие. Это означает, что всё состояние должно быть специфичным для объекта модуля (например, с использованием PyModule_GetState()) или его содержимого (например, __dict__ модуля или отдельных классов, созданных с помощью PyType_FromSpec()).
Ожидается, что все модули, созданные с использованием инициализации в несколько фаз, будут поддерживать поддержка дочерних интерпретаторов. Обеспечение независимости нескольких модулей обычно достаточно для этого.
Для запроса инициализации в несколько фаз функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef с непустым m_slots. Перед возвратом экземпляр PyModuleDef должен быть инициализирован с помощью следующей функции:
-
PyObject* PyModuleDef_Init(PyModuleDef *def) -
Значение возврата: Заимствованная ссылка.
Обеспечивает, что определение модуля является корректно инициализированным объектом Python, который правильно сообщает свой тип и счётчик ссылок.
Возвращает def, преобразованный в
PyObject*, илиNULLв случае ошибки.Введено в версии 3.5.
Член m_slots определения модуля должен указывать на массив структур PyModuleDef_Slot:
-
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) -
Значение возврата: Новая ссылка.
Создаёт новый объект модуля, используя определение в module и ModuleSpec spec. Это аналогично
PyModule_FromDefAndSpec2()с module_api_version, установленным вPYTHON_API_VERSION.Введено в версии 3.5.
-
PyObject * PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version) -
Значение возврата: Новая ссылка.
Создаёт новый объект модуля, используя определение в module и ModuleSpec spec, предполагая версию API module_api_version. Если эта версия не соответствует версии работающего интерпретатора, генерируется
RuntimeWarning.Примечание
Большинство случаев использования этой функции должны использовать
PyModule_FromDefAndSpec(); используйте эту функцию только если вы уверены, что вам это нужно.Введено в версии 3.5.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def) -
Обрабатывает любые слоты выполнения (
Py_mod_exec), заданные в def.Введено в версии 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring) -
Устанавливает строку документации для module на docstring. Эта функция вызывается автоматически при создании модуля из
PyModuleDef, используяPyModule_CreateилиPyModule_FromDefAndSpec.Введено в версии 3.5.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions) -
Добавляет функции из массива functions, завершённого
NULL, в module. Обратитесь к документацииPyMethodDefдля получения подробной информации об отдельных записях (из-за отсутствия общего пространства имён модулей, модульные «функции», реализованные на C, как правило, получают модуль в качестве своего первого параметра, делая их похожими на методы экземпляров в Python-классах). Эта функция вызывается автоматически при создании модуля изPyModuleDef, используяPyModule_CreateилиPyModule_FromDefAndSpec.Введено в версии 3.5.
Функции поддержки
Функция инициализации модуля (если используется однофазная инициализация) или функция, вызываемая из слота выполнения модуля (если используется многофазная инициализация), может использовать следующие функции для помощи в инициализации состояния модуля:
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) -
Добавляет объект в модуль под именем имя. Это вспомогательная функция, которую можно использовать из функции инициализации модуля. При успехе функция заимствует ссылку на значение. Возвращает
-1при ошибке,0при успехе.Примечание
В отличие от других функций, которые заимствуют ссылки,
PyModule_AddObject()декрементирует счетчик ссылок значение только при успехе.Это означает, что необходимо проверять значение возврата, и код вызывающей программы должен
Py_DECREF()значение вручную при ошибке. Пример использования:Py_INCREF(spam); if (PyModule_AddObject(module, "spam", spam) < 0) { Py_DECREF(module); Py_DECREF(spam); return NULL; }
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value) -
Добавляет целочисленную константу в модуль под именем имя. Эта вспомогательная функция может использоваться из функции инициализации модуля. Возвращает
-1при ошибке,0при успехе.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) -
Добавляет строковую константу в модуль под именем имя. Эта вспомогательная функция может использоваться из функции инициализации модуля. Строка значение должна быть
NULL-терминированной. Возвращает-1при ошибке,0при успехе.
-
int PyModule_AddIntMacro(PyObject *module, macro) -
Добавляет целочисленную константу в модуль. Имя и значение берутся из макроса. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет целочисленную константу AF_INET со значением AF_INET в модуль. Возвращает-1при ошибке,0при успехе.
-
int PyModule_AddStringMacro(PyObject *module, macro) -
Добавляет строковую константу в модуль.
Поиск модуля
Однофазная инициализация создаёт одиночные модули, которые можно искать в контексте текущего интерпретатора. Это позволяет получить объект модуля позже, используя только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с помощью многофазной инициализации, так как несколько таких модулей могут быть созданы из одного определения.
-
PyObject* PyState_FindModule(PyModuleDef *def) -
Значение возврата: Заимствованная ссылка.
Возвращает объект модуля, созданный из def для текущего интерпретатора. Этот метод требует, чтобы объект модуля был присоединён к состоянию интерпретатора с помощью
PyState_AddModule()предварительно. В случае, если соответствующий объект модуля не найден или ещё не присоединён к состоянию интерпретатора, возвращаетNULL.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def) -
Присоединяет объект модуля, переданный в функцию, к состоянию интерпретатора. Это позволяет получить доступ к объекту модуля с помощью
PyState_FindModule().Эффективно только для модулей, созданных с помощью однофазной инициализации.
Python автоматически вызывает
PyState_AddModuleпосле импорта модуля, поэтому вызывать его из кода инициализации модуля не нужно (хотя это безопасно). Явное обращение требуется только если собственный код инициализации модуля затем вызываетPyState_FindModule. Функция в основном предназначена для реализации альтернативных механизмов импорта (либо вызывая её напрямую, либо обращаясь к её реализации для получения подробностей о необходимых обновлениях состояния).Возвращает 0 при успехе или -1 при ошибке.
Введено в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def) -
Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает 0 при успехе или -1 при ошибке.
Введено в версии 3.3.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/c-api/module.html