Объекты модуля

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.

Изменено в версии 3.5: До версии 3.5 этот член всегда был установлен в NULL и определялся как:

inquiry m_reload
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: Больше не вызывается до выделения состояния модуля.

Однофазная инициализация

Функция инициализации модуля может создавать и возвращать объект модуля напрямую. Это называется «однофазной инициализацией» и использует одну из следующих двух функций создания модуля:

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.

Массив 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.

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)
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_AddStringMacro(PyObject *module, macro)

Добавьте строковую константу в модуль.

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.

Вернуться на верх