Объекты модуля¶
-
PyTypeObject PyModule_Type¶
- Part of the Стабильный 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)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI since version 3.7.
Возвращает новый объект module с атрибутом
__name__
, равным name. Атрибуты модуля__name__
,__doc__
,__package__
, и__loader__
заполнены (все, кроме__name__
, имеют значениеNone
); вызывающий модуль отвечает за предоставление атрибута__file__
.Добавлено в версии 3.3.
Изменено в версии 3.4:
__package__
и__loader__
имеют значенияNone
.
-
PyObject *PyModule_New(const char *name)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI.
Аналогично
PyModule_NewObject()
, но имя представляет собой строку в кодировке UTF-8, а не объект в Юникоде.
-
PyObject *PyModule_GetDict(PyObject *module)¶
- Возвращаемое значение: Заимствованная ссылка. Part of the Стабильный ABI.
Возвращает объект dictionary, который реализует пространство имен module; этот объект совпадает с атрибутом
__dict__
объекта module. Если module не является объектом module (или подтипом объекта module), вызываетсяSystemError
и возвращаетсяNULL
.Рекомендуется, чтобы расширения использовали другие функции
PyModule_*
иPyObject_*
, а не манипулировали напрямую__dict__
модуля.
-
PyObject *PyModule_GetNameObject(PyObject *module)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI since version 3.7.
Возвращает значение
__name__
для модуля. Если модуль не предоставляет значение или оно не является строкой, вызываетсяSystemError
и возвращаетсяNULL
.Добавлено в версии 3.3.
-
const char *PyModule_GetName(PyObject *module)¶
- Part of the Стабильный ABI.
Аналогично
PyModule_GetNameObject()
, но возвращает имя, закодированное как'utf-8'
.
-
void *PyModule_GetState(PyObject *module)¶
- Part of the Стабильный ABI.
Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный во время создания модуля, или
NULL
. СмотритеPyModuleDef.m_size
.
-
PyModuleDef *PyModule_GetDef(PyObject *module)¶
- Part of the Стабильный ABI.
Возвращает указатель на структуру
PyModuleDef
, из которой был создан модуль, илиNULL
, если модуль не был создан из определения.
-
PyObject *PyModule_GetFilenameObject(PyObject *module)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI.
Возвращает имя файла, из которого был загружен module, используя атрибут
__file__
для module. Если это не определено или это не строка в юникоде, вызовитеSystemError
и вернитеNULL
; в противном случае верните ссылку на объект в Юникоде.Добавлено в версии 3.2.
-
const char *PyModule_GetFilename(PyObject *module)¶
- Part of the Стабильный ABI.
Аналогично
PyModule_GetFilenameObject()
, но возвращает имя файла в кодировке „utf-8“.Не рекомендуется, начиная с версии 3.2:
PyModule_GetFilename()
вызываетUnicodeEncodeError
для некодируемых имен файлов, вместо этого используйтеPyModule_GetFilenameObject()
.
Инициализация модулей C¶
Объекты Modules обычно создаются из модулей расширения (разделяемых библиотек, которые экспортируют функцию инициализации) или скомпилированных модулей (где функция инициализации добавляется с помощью PyImport_AppendInittab()
). Смотрите Создание расширений на языках C и C++ или Расширение встроенного Python для получения подробной информации.
Функция инициализации может либо передать экземпляр определения модуля в PyModule_Create()
и вернуть результирующий объект модуля, либо запросить «многофазную инициализацию», вернув саму структуру определения.
-
type PyModuleDef¶
- Part of the Стабильный ABI (including all members).
Структура определения модуля, которая содержит всю информацию, необходимую для создания объекта module. Обычно для каждого модуля существует только одна статически инициализируемая переменная этого типа.
-
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
.
-
traverseproc m_traverse¶
Функция обхода, вызываемая во время обхода GC объекта module, или
NULL
, если она не нужна.Эта функция не вызывается, если состояние модуля было запрошено, но еще не присвоено. Это происходит сразу после создания модуля и перед выполнением модуля (
Py_mod_exec
функция). Точнее, эта функция не вызывается, еслиm_size
больше 0, а состояние модуля (возвращаемоеPyModule_GetState()
) равноNULL
.Изменено в версии 3.9: Больше не вызывается до присвоения состояния модулю.
-
inquiry m_clear¶
Функция очистки, вызываемая во время очистки объекта module от GC, или
NULL
, если она не нужна.Эта функция не вызывается, если состояние модуля было запрошено, но еще не присвоено. Это происходит сразу после создания модуля и перед выполнением модуля (
Py_mod_exec
функция). Точнее, эта функция не вызывается, еслиm_size
больше 0, а состояние модуля (возвращаемоеPyModule_GetState()
) равноNULL
.Подобно
PyTypeObject.tp_clear
, эта функция не всегда вызывается перед освобождением модуля. Например, когда подсчета ссылок достаточно, чтобы определить, что объект больше не используется, циклический сборщик мусора не задействован иm_free
вызывается напрямую.Изменено в версии 3.9: Больше не вызывается до присвоения состояния модулю.
-
freefunc m_free¶
Функция, вызываемая во время освобождения объекта module, или
NULL
, если она не нужна.Эта функция не вызывается, если состояние модуля было запрошено, но еще не присвоено. Это происходит сразу после создания модуля и перед выполнением модуля (
Py_mod_exec
функция). Точнее, эта функция не вызывается, еслиm_size
больше 0, а состояние модуля (возвращаемоеPyModule_GetState()
) равноNULL
.Изменено в версии 3.9: Больше не вызывается до присвоения состояния модулю.
-
PyModuleDef_Base m_base¶
Однофазная инициализация¶
Функция инициализации модуля может создавать и возвращать объект модуля напрямую. Это называется «однофазной инициализацией» и использует одну из следующих двух функций создания модуля:
-
PyObject *PyModule_Create(PyModuleDef *def)¶
- Возвращаемое значение: Новая ссылка.
Создайте новый объект module, используя определение в def. Он ведет себя следующим образом
PyModule_Create2()
с параметром module_api_version, равнымPYTHON_API_VERSION
.
-
PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI.
Создайте новый объект module, используя определение в def, предполагая версию API module_api_version. Если эта версия не соответствует версии запущенного интерпретатора, выдается
RuntimeWarning
.Примечание
В большинстве случаев для использования этой функции следует использовать
PyModule_Create()
; используйте это только в том случае, если вы уверены, что вам это нужно.
Прежде чем он будет возвращен из функции инициализации, результирующий объект модуля обычно заполняется с помощью таких функций, как PyModule_AddObjectRef()
.
Многофазная инициализация¶
Альтернативный способ указать расширения - запросить «многофазную инициализацию». Модули расширения, созданные таким образом, ведут себя скорее как модули Python: инициализация разделена на фазу создания, когда создается объект модуля, и фазу выполнения, когда он заполняется. Различие аналогично методам классов __new__()
и __init__()
.
В отличие от модулей, созданных с использованием однофазной инициализации, эти модули не являются одиночными: если запись sys.modules удалена и модуль повторно импортирован, создается новый объект module, а старый модуль подвергается обычной сборке мусора - как в случае с модулями Python. По умолчанию несколько модулей, созданных на основе одного и того же определения, должны быть независимыми: изменения в одном из них не должны влиять на другие. Это означает, что все состояния должны быть специфичны для объекта module (используя, например, using PyModule_GetState()
) или его содержимого (например, __dict__
модуля или отдельных классов, созданных с помощью PyType_FromSpec()
).
Ожидается, что все модули, созданные с использованием многофазной инициализации, будут поддерживать sub-interpreters. Обычно для достижения этой цели достаточно убедиться в независимости нескольких модулей.
Чтобы запросить многофазную инициализацию, функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef
с непустым значением m_slots
. Прежде чем он будет возвращен, экземпляр PyModuleDef
должен быть инициализирован с помощью следующей функции:
-
PyObject *PyModuleDef_Init(PyModuleDef *def)¶
- Возвращаемое значение: Заимствованная ссылка. Part of the Стабильный ABI since version 3.5.
Гарантирует, что определение модуля является правильно инициализированным объектом Python, который правильно сообщает о своем типе и количестве ссылок.
Возвращает значение def, приведенное к
PyObject*
, илиNULL
, если произошла ошибка.Добавлено в версии 3.5.
Элемент m_slots определения модуля должен указывать на массив структур PyModuleDef_Slot
:
-
type PyModuleDef_Slot¶
-
int slot¶
Идентификатор слота, выбранный из доступных значений, описанных ниже.
-
void *value¶
Значение слота, значение которого зависит от идентификатора слота.
Добавлено в версии 3.5.
-
int slot¶
Массив m_slots должен завершаться слотом с идентификатором 0.
Доступны следующие типы слотов:
-
Py_mod_create¶
Указывает функцию, которая вызывается для создания самого объекта module. Указатель 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
не-NULL
m_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)¶
- Возвращаемое значение: Новая ссылка.
Создайте новый объект module, используя определение в def и спецификацию модуля spec. Это ведет себя как
PyModule_FromDefAndSpec2()
с параметром module_api_version, равнымPYTHON_API_VERSION
.Добавлено в версии 3.5.
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI since version 3.7.
Создайте новый объект module, учитывая определение в def и спецификацию модуля spec, предполагая версию API module_api_version. Если эта версия не соответствует версии запущенного интерпретатора, выдается сообщение
RuntimeWarning
.Примечание
В большинстве случаев для использования этой функции следует использовать
PyModule_FromDefAndSpec()
; используйте это только в том случае, если вы уверены, что вам это нужно.Добавлено в версии 3.5.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def)¶
- Part of the Стабильный ABI since version 3.7.
Обработайте все интервалы выполнения (
Py_mod_exec
), указанные в def.Добавлено в версии 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring)¶
- Part of the Стабильный ABI since version 3.7.
Задайте для module значение docstring. Эта функция вызывается автоматически при создании модуля из
PyModuleDef
, используя либоPyModule_Create
, либоPyModule_FromDefAndSpec
.Добавлено в версии 3.5.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)¶
- Part of the Стабильный ABI since version 3.7.
Добавьте функции из массива
NULL
завершенных функций в модуль. Обратитесь к документацииPyMethodDef
для получения подробной информации об отдельных элементах (из-за отсутствия общего пространства имен модулей «функции» уровня модуля, реализованные на C, обычно получают модуль в качестве своего первого параметра, что делает их похожими на методы экземпляра в классах Python). Эта функция вызывается автоматически при создании модуля изPyModuleDef
, используя либоPyModule_Create
, либоPyModule_FromDefAndSpec
.Добавлено в версии 3.5.
Вспомогательные функции¶
Функция инициализации модуля (при использовании однофазной инициализации) или функция, вызываемая из интервала выполнения модуля (при использовании многофазной инициализации), может использовать следующие функции для инициализации состояния модуля:
-
int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)¶
- Part of the Стабильный ABI since version 3.10.
Добавьте объект в модуль в качестве имени. Это удобная функция, которую можно использовать из функции инициализации модуля.
В случае успеха верните
0
. В случае ошибки создайте исключение и верните-1
.Возвращает
NULL
, если значение равно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_DECREF()
следует использоватьPy_XDECREF()
, поскольку obj может бытьNULL
.Добавлено в версии 3.10.
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)¶
- Part of the Стабильный 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_DECREF()
следует использоватьPy_XDECREF()
, поскольку obj может бытьNULL
.
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value)¶
- Part of the Стабильный ABI.
Добавьте целочисленную константу в module в качестве имени. Эту удобную функцию можно использовать из функции инициализации модуля. Возвращает
-1
при ошибке,0
при успешном выполнении.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)¶
- Part of the Стабильный ABI.
Добавьте строковую константу в module в качестве name. Эту удобную функцию можно использовать из функции инициализации модуля. Строка value должна заканчиваться
NULL
. Возвращает-1
при ошибке,0
при успешном выполнении.
-
PyModule_AddIntMacro(module, macro)¶
Добавьте константу int в module. Имя и значение взяты из macro. Например,
PyModule_AddIntMacro(module, AF_INET)
добавляет константу int AF_INET со значением AF_INET в module. Возвращает-1
при ошибке,0
при успешном выполнении.
-
PyModule_AddStringMacro(module, macro)¶
Добавьте строковую константу в module.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type)¶
- Part of the Стабильный ABI since version 3.10.
Добавьте объект типа в module. Объект типа завершается внутренним вызовом
PyType_Ready()
. Имя объекта типа берется из последнего компонентаtp_name
после точки. Возвращает-1
при ошибке,0
при успешном выполнении.Добавлено в версии 3.9.
Поиск по модулю¶
Одноэтапная инициализация создает одноэлементные модули, которые можно искать в контексте текущего интерпретатора. Это позволяет извлекать объект module позже, используя только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с использованием многофазной инициализации, поскольку из одного определения можно создать несколько таких модулей.
-
PyObject *PyState_FindModule(PyModuleDef *def)¶
- Возвращаемое значение: Заимствованная ссылка. Part of the Стабильный ABI.
Возвращает объект module, который был создан из def для текущего интерпретатора. Этот метод требует, чтобы объект module был предварительно присоединен к состоянию интерпретатора с помощью
PyState_AddModule()
. В случае, если соответствующий объект модуля не найден или еще не был присоединен к состоянию интерпретатора, он возвращаетNULL
.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def)¶
- Part of the Стабильный ABI since version 3.3.
Переводит объект модуля, переданный функции, в состояние интерпретатора. Это позволяет сделать объект модуля доступным через
PyState_FindModule()
.Действует только для модулей, созданных с использованием однофазной инициализации.
Python вызывает
PyState_AddModule
автоматически после импорта модуля, поэтому нет необходимости (но и безопасно) вызывать его из кода инициализации модуля. Явный вызов необходим только в том случае, если собственный код инициализации модуля впоследствии вызываетPyState_FindModule
. Функция в основном предназначена для реализации альтернативных механизмов импорта (либо путем прямого вызова, либо путем обращения к ее реализации для получения подробной информации о необходимых обновлениях состояния).Вызывающий должен удерживать GIL.
Возвращает 0 в случае успеха или -1 в случае неудачи.
Добавлено в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def)¶
- Part of the Стабильный ABI since version 3.3.
Удаляет объект module, созданный из def, из состояния интерпретатора. Возвращает 0 в случае успеха или -1 в случае сбоя.
Вызывающий должен удерживать GIL.
Добавлено в версии 3.3.