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

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.

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

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

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

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

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.

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

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)
Возвращаемое значение: Новая ссылка.

Создайте новый объект 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.

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