Документация Python неофициальный перевод
Содержание страницы

Объекты модулей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__ module. Если модуль не предоставляет такого значения или оно не является строкой, возбуждается SystemError и возвращается NULL.

Новое в версии 3.3.

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.

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.

char* m_name

Имя нового модуля.

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

Массив определений слотов для многофазной инициализации, завершающийся записью {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.

Однофазная инициализация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.

Массив 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 имеет не-NULL m_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 для более подробной информации о многофазной инициализации.

Низкоуровневые функции создания модулей 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 при успехе.

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)

Добавляет строковую константу в модуль под именем имя. Эту удобную функцию можно использовать из функции инициализации модуля. Строка значение должна быть нуль-терминированной (NULL). Возвращает -1 при ошибке, 0 при успехе.

int PyModule_AddIntMacro(PyObject *module, macro)

Добавляет целочисленную константу в модуль module. Имя и значение берутся из macro. Например, PyModule_AddIntMacro(module, AF_INET) добавляет целочисленную константу AF_INET со значением AF_INET в модуль module. Возвращает -1 в случае ошибки, 0 при успешном выполнении.

int PyModule_AddStringMacro(PyObject *module, macro)

Добавляет строковую константу в module.

Поиск модуля Module lookup

Однофазная инициализация создаёт модули-одиночки, которые можно найти в контексте текущего интерпретатора. Это позволяет впоследствии получить объект модуля, имея только ссылку на определение модуля.

Эти функции не будут работать с модулями, созданными с помощью многофазной инициализации, поскольку из одного определения можно создать несколько таких модулей.

PyObject* PyState_FindModule(PyModuleDef *def)

Возвращает объект модуля, созданный из def для текущего интерпретатора. Этот метод требует, чтобы объект модуля был предварительно присоединён к состоянию интерпретатора с помощью PyState_AddModule(). Если соответствующий объект модуля не найден или ещё не присоединён к состоянию интерпретатора, возвращается NULL.

int PyState_AddModule(PyObject *module, PyModuleDef *def)

Прикрепляет объект модуля, переданный функции, к состоянию интерпретатора. Это позволяет обращаться к объекту модуля через PyState_FindModule().

Действует только на модули, созданные с помощью однофазной инициализации.

Новое в версии 3.3.

int PyState_RemoveModule(PyModuleDef *def)

Удаляет объект модуля, созданный из def, из состояния интерпретатора.

Новое в версии 3.3.