Spec-Zone.ru › Python 3.10

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

PyTypeObject PyModule_Type
Часть Стабильного ABI.

Этот экземпляр PyTypeObject представляет тип модуля Python. Он экспонируется программам Python как types.ModuleType.

int PyModule_Check(PyObject *p)

Возвращает истину, если p является объектом модуля или подтипом объекта модуля. Эта функция всегда выполняется успешно.

int PyModule_CheckExact(PyObject *p)

Возвращает истину, если p является объектом модуля, но не подтипом PyModule_Type. Эта функция всегда выполняется успешно.

PyObject *PyModule_NewObject(PyObject *name)
Значение возврата: Новая ссылка. Часть Стабильного ABI с версии 3.7.

Возвращает новый объект модуля с атрибутом __name__, установленным на name. Атрибуты модуля __name__, __doc__, __package__ и __loader__ заполняются (все, кроме __name__, устанавливаются на None); вызывающий код отвечает за предоставление атрибута __file__.

Добавлена в версии 3.3.

Изменено в версии 3.4: __package__ и __loader__ устанавливаются на None.

PyObject *PyModule_New(const char *name)
Значение возврата: Новая ссылка. Часть Стабильного ABI.

Аналогично PyModule_NewObject(), но имя — строка в кодировке UTF-8 вместо объекта Unicode.

PyObject *PyModule_GetDict(PyObject *module)
Значение возврата: Заимствованная ссылка. Часть Стабильного ABI.

Возвращает объект словаря, реализующий пространство имен module; этот объект совпадает с атрибутом __dict__ объекта модуля. Если module не является объектом модуля (или подтипом объекта модуля), возбуждается SystemError и возвращается NULL.

Рекомендуется, чтобы расширения использовали другие функции PyModule_* и PyObject_* вместо непосредственного манипулирования атрибутом __dict__ модуля.

PyObject *PyModule_GetNameObject(PyObject *module)
Значение возврата: Новая ссылка. Часть Стабильного ABI с версии 3.7.

Возвращает значение __name__ модуля module. Если модуль не предоставляет его или оно не является строкой, возбуждается SystemError и возвращается NULL.

Добавлена в версии 3.3.

const char *PyModule_GetName(PyObject *module)
Часть Стабильного ABI.

Аналогично PyModule_GetNameObject(), но возвращает закодированное в 'utf-8' имя.

void *PyModule_GetState(PyObject *module)
Часть Стабильного ABI.

Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный при создании модуля, или NULL. См. PyModuleDef.m_size.

PyModuleDef *PyModule_GetDef(PyObject *module)
Часть Стабильного ABI.

Возвращает указатель на структуру PyModuleDef, из которой был создан модуль, или NULL если модуль не был создан из определения.

PyObject *PyModule_GetFilenameObject(PyObject *module)
Значение возврата: Новая ссылка. Часть Стабильного ABI.

Возвращает имя файла, из которого был загружен module, используя атрибут __file__ module. Если он не определён или не является строкой Unicode, возбуждается SystemError и возвращается NULL; в противном случае возвращается ссылка на объект Unicode.

Добавлена в версии 3.2.

const char *PyModule_GetFilename(PyObject *module)
Часть Стабильного ABI.

Аналогично PyModule_GetFilenameObject(), но возвращает имя файла, закодированное в ‘utf-8’.

Устарело начиная с версии 3.2: PyModule_GetFilename() возбуждает UnicodeEncodeError при некодируемых именах файлов, используйте PyModule_GetFilenameObject() вместо этого.

END_OF_DOCUMENT_MARKER

Инициализация модулей C

Объекты модулей обычно создаются из модулей расширения (динамических библиотек, которые экспортируют функцию инициализации) или встроенных модулей (где функция инициализации добавляется с помощью PyImport_AppendInittab()). Подробности см. в разделах Компиляция расширений C и C++ или Расширение встроенного Python.

Функция инициализации может либо передать экземпляр определения модуля в PyModule_Create() и вернуть полученный объект модуля, либо запросить «многофазную инициализацию», вернув саму структуру определения.

type PyModuleDef
Часть Стабильной ABI (включая все члены).

Структура определения модуля, которая содержит всю информацию, необходимую для создания объекта модуля. Обычно для каждого модуля существует только одна статически инициализированная переменная этого типа.

PyModuleDef_Base m_base

Этот член всегда инициализируется значением PyModuleDef_HEAD_INIT.

const char *m_name

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

const char *m_doc

Строка документации модуля; обычно используется переменная 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

Функция обхода для вызова во время обхода объекта модуля во время сбора мусора, или NULL если не требуется.

Эта функция не вызывается, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и перед выполнением модуля (функция Py_mod_exec). Точнее, эта функция не вызывается, если m_size больше 0, а состояние модуля (как возвращается PyModule_GetState()) равно NULL.

Изменено в версии 3.9: Больше не вызывается перед выделением состояния модуля.

inquiry m_clear

Функция очистки для вызова во время очистки объекта модуля во время сбора мусора, или 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)
Значение возврата: Новая ссылка.

Создает новый объект модуля, используя определение в def. Это эквивалентно PyModule_Create2() со значением module_api_version, установленным в PYTHON_API_VERSION.

PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version)
Значение возврата: Новая ссылка. Часть Стабильной ABI.

Создает новый объект модуля, используя определение в def, предполагая версию API module_api_version. Если эта версия не соответствует версии интерпретатора, используемого в работе, генерируется RuntimeWarning.

Примечание

В большинстве случаев следует использовать PyModule_Create(); используйте эту функцию только в том случае, если вы уверены в необходимости.

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

Многофазная инициализация

Альтернативный способ указания расширений — запрос «многофазной инициализации». Модули расширений, созданные таким образом, ведут себя больше как модули Python: инициализация разделена между фазой создания, когда создаётся объект модуля, и фазой выполнения, когда он заполняется. Различие аналогично методам __new__() и __init__() классов.

В отличие от модулей, созданных с помощью однофазной инициализации, эти модули не являются синглтонами: если запись в sys.modules удаляется, а модуль повторно импортируется, создаётся новый объект модуля, а старый модуль становится объектом для обычного сбора мусора — как и в случае с модулями Python. По умолчанию несколько модулей, созданных на основе одного определения, должны быть независимыми: изменения в одном не должны влиять на другие. Это означает, что все состояния должны быть специфичными для объекта модуля (например, используя PyModule_GetState()) или его содержимого (например, __dict__ модуля или отдельных классов, созданных с помощью PyType_FromSpec()).

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

Для запроса многофазной инициализации функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef с непустым m_slots. Перед возвратом экземпляр PyModuleDef должен быть инициализирован с помощью следующей функции:

PyObject *PyModuleDef_Init(PyModuleDef *def)
Значение возврата: Заимствованная ссылка. Часть Стабильной ABI с версии 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

Указывает функцию, которая вызывается для создания самого объекта модуля. Указатель 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)
Значение возврата: Новая ссылка.

Создаёт новый объект модуля, используя определение в def и ModuleSpec spec. Это эквивалентно PyModule_FromDefAndSpec2() с module_api_version, установленным в PYTHON_API_VERSION.

Новая в версии 3.5.

PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)
Значение возврата: Новая ссылка. Часть Стабильной ABI с версии 3.7.

Создаёт новый объект модуля, используя определение в def и ModuleSpec spec, предполагая версию API module_api_version. Если эта версия не соответствует версии работающего интерпретатора, генерируется RuntimeWarning.

Примечание

В большинстве случаев следует использовать PyModule_FromDefAndSpec(); используйте эту функцию только если вы уверены, что вам это нужно.

Новая в версии 3.5.

int PyModule_ExecDef(PyObject *module, PyModuleDef *def)
Часть Стабильной ABI с версии 3.7.

Обрабатывает любые слоты выполнения (Py_mod_exec), заданные в def.

Новая в версии 3.5.

int PyModule_SetDocString(PyObject *module, const char *docstring)
Часть Стабильной ABI с версии 3.7.

Устанавливает строку документации для module в docstring. Эта функция вызывается автоматически при создании модуля из PyModuleDef, используя PyModule_Create или PyModule_FromDefAndSpec.

Новая в версии 3.5.

int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)
Часть Стабильной ABI с версии 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)
Часть Стабильной ABI с версии 3.10.

Добавляет объект в модуль под именем name. Это вспомогательная функция, которую можно использовать из функции инициализации модуля.

В случае успеха возвращает 0. В случае ошибки генерирует исключение и возвращает -1.

Возвращает NULL если value является 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)
Часть Стабильной 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_XDECREF() вместо Py_DECREF(), так как obj может быть NULL.

int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
Часть Стабильной ABI.

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

int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)
Часть Стабильной ABI.

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

int PyModule_AddIntMacro(PyObject *module, macro)

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

int PyModule_AddStringMacro(PyObject *module, macro)

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

int PyModule_AddType(PyObject *module, PyTypeObject *type)
Часть Стабильной ABI с версии 3.10.

Добавляет объект типа в модуль. Объект типа завершается вызовом внутренней функции PyType_Ready(). Имя объекта типа берется из последней компоненты tp_name после точки. Возвращает -1 при ошибке, 0 при успехе.

Новая в версии 3.9.

Поиск модулей

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

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

PyObject *PyState_FindModule(PyModuleDef *def)
Возвращаемое значение: Заимствованная ссылка. Часть Стабильной ABI.

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

int PyState_AddModule(PyObject *module, PyModuleDef *def)
Часть Стабильной ABI с версии 3.3.

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

Эффективно только для модулей, созданных с использованием однофазной инициализации.

Python автоматически вызывает PyState_AddModule после импорта модуля, поэтому вызывать его из кода инициализации модуля не нужно (но это не повредит). Явный вызов требуется только если собственный код инициализации модуля затем вызывает PyState_FindModule. Функция предназначена в основном для реализации альтернативных механизмов импорта (либо вызывая её напрямую, либо обращаясь к её реализации для получения подробностей о необходимых обновлениях состояния).

Вызывающий код должен владеть GIL.

Возвращает 0 при успехе или -1 при неудаче.

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

int PyState_RemoveModule(PyModuleDef *def)
Часть Стабильной ABI с версии 3.3.

Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает 0 при успехе или -1 при неудаче.

Вызывающий код должен владеть GIL.

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

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/c-api/module.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API