Содержание страницы
Объекты модулей¶Module Objects
-
PyTypeObject
PyModule_Type¶ Этот экземпляр
PyTypeObjectпредставляет тип Python-модуля. Он доступен программам Python какtypes.ModuleType.
-
int
PyModule_Check(PyObject *p)¶ Возвращает истину, если p является объектом модуля или подтипом объекта модуля.
-
int
PyModule_CheckExact(PyObject *p)¶ Возвращает истину, если 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__модуля. Если модуль не предоставляет его или оно не является строкой, возбуждается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)¶ - Возвращаемое значение: новая ссылка.
Возвращает имя файла, из которого был загружен модуль, используя атрибут
__file__модуля. Если он не определён или не является строкой Unicode, возбуждаетсяSystemErrorи возвращаетсяNULL; в противном случае возвращается ссылка на объект Unicode.Новое в версии 3.2.
-
const char*
PyModule_GetFilename(PyObject *module)¶ Аналогично
PyModule_GetFilenameObject(), но возвращает имя файла, закодированное в 'utf-8'.Устарело с версии 3.2:
PyModule_GetFilename()возбуждаетUnicodeEncodeErrorдля некодируемых имён файлов; вместо него используйтеPyModule_GetFilenameObject().
Инициализация C-модулей¶Initializing C modules
Объекты модулей обычно создаются из модулей расширения (общих библиотек,\nкоторые экспортируют функцию инициализации) или из встраиваемых модулей\n(где функция инициализации добавляется с помощью PyImport_AppendInittab()).\nПодробнее см. Building C and C++ Extensions или Extending Embedded Python.
Функция инициализации может либо передать экземпляр определения модуля\nв PyModule_Create() и вернуть результирующий объект модуля,\nлибо запросить «многофазную инициализацию», вернув саму структуру определения.
-
PyModuleDef¶ Структура определения модуля, содержащая всю информацию, необходимую для создания\nобъекта модуля. Обычно для каждого модуля существует только одна статически\nинициализированная переменная этого типа.
-
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означает, что модуль не поддерживает\nпод-интерпретаторы, так как имеет глобальное состояние.Установка в неотрицательное значение означает, что модуль можно\nпереинициализировать, и указывает дополнительный объём памяти, необходимый\nдля его состояния. Неотрицательное значение
m_sizeтребуется для многофазной\nинициализации.Подробнее см. PEP 3121.
-
PyMethodDef*
m_methods¶ Указатель на таблицу функций уровня модуля, описываемых значениями
PyMethodDef. Может бытьNULL, если функции отсутствуют.
-
PyModuleDef_Slot*
m_slots¶ Массив определений слотов для многофазной инициализации, завершающийся\nзаписью
{0, NULL}.\nПри использовании однофазной инициализации m_slots должен бытьNULL.
-
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.
-
PyModuleDef_Base
Однофазная инициализация¶Single-phase initialization
Функция инициализации модуля может напрямую создать и вернуть объект модуля. Это называется «однофазной инициализацией» и использует одну из двух следующих функций создания модуля:
-
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().
Многофазная инициализация¶Multi-phase initialization
Альтернативный способ задания расширений – запросить «многофазную инициализацию».
Модули расширения, созданные таким образом, ведут себя больше как модули 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.
-
int
Массив m_slots должен завершаться слотом с id 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.-
PyObject*
-
Py_mod_exec¶ Задаёт функцию, которая вызывается для выполнения модуля. Это эквивалентно выполнению кода модуля Python: обычно эта функция добавляет в модуль классы и константы. Сигнатура функции такова:
Если указано несколько слотов
Py_mod_exec, они обрабатываются в том порядке, в котором расположены в массиве m_slots.
См. PEP 489 для более подробной информации о многофазной инициализации.
Низкоуровневые функции создания модулей ¶Low-level module creation functions
Следующие функции вызываются «под капотом» при использовании многофазной инициализации. Их можно использовать напрямую, например, при динамическом создании объектов модуля. Обратите внимание, что для полной инициализации модуля необходимо вызвать как PyModule_FromDefAndSpec, так и PyModule_ExecDef.
-
PyObject *
PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec)¶ - Возвращаемое значение: новая ссылка.
Создаёт новый объект модуля на основе определения module и спецификации модуля spec. Работает как
PyModule_FromDefAndSpec2()с module_api_version, установленным вPYTHON_API_VERSION.Новое в версии 3.5.
-
PyObject *
PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)¶ - Возвращаемое значение: новая ссылка.
Создаёт новый объект модуля на основе определения module и спецификации модуля 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)¶ Устанавливает 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.
Вспомогательные функции¶Support functions
Функция инициализации модуля (при однофазной инициализации) или функция, вызываемая из слота выполнения модуля (при многофазной инициализации), могут использовать следующие функции для инициализации состояния модуля:
-
int
PyModule_AddObject(PyObject *module, const char *name, PyObject *value)¶ Добавляет объект в module под именем name. Это удобная функция, которую можно использовать в функции инициализации модуля. При успехе она крадёт ссылку на value. Возвращает
-1при ошибке,0при успехе.Примечание
В отличие от других функций, похищающих ссылки,
PyModule_AddObject()только уменьшает счётчик ссылок value при успехе.Это означает, что возвращаемое значение необходимо проверять, и в случае ошибки вызывающий код должен
Py_DECREF()value вручную. Пример использования: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)¶ Добавляет целочисленную константу в модуль module под именем name. Эту удобную функцию можно использовать из функции инициализации модуля. Возвращает
-1в случае ошибки,0при успешном выполнении.
-
int
PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)¶ Добавляет строковую константу в модуль module под именем name. Эту удобную функцию можно использовать из функции инициализации модуля. Строка value должна быть
NULL-терминированной. Возвращает-1в случае ошибки,0при успешном выполнении.
-
int
PyModule_AddIntMacro(PyObject *module, macro)¶ Добавляет целочисленную константу в модуль module. Имя и значение берутся из macro. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет целочисленную константу AF_INET со значением AF_INET в модуль module. Возвращает-1в случае ошибки,0при успешном выполнении.
Поиск модуля ¶Module lookup
Однофазная инициализация создаёт модули-одиночки, которые можно найти в контексте текущего интерпретатора. Это позволяет впоследствии получить объект модуля, имея только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с помощью многофазной инициализации, поскольку из одного определения можно создать несколько таких модулей.
-
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.