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