Spec-Zone.ru › Python 3.8

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

PyTypeObject PyModule_Type

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

Возвращает новый объект модуля с атрибутом __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.

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

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

Введено в версии 3.2.

const char* PyModule_GetFilename(PyObject *module)

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

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

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

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

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

PyModuleDef

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

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 объекта модуля, или 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.

Одноэтапная инициализация

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

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().

Инициализация в несколько фаз

Альтернативный способ указания расширений — запрос «инициализации в несколько фаз». Модули расширений, созданные таким образом, ведут себя более как модули 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 должен завершаться слотом с идентификатором 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)
Значение возврата: Новая ссылка.

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

Введено в версии 3.5.

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

Создаёт новый объект модуля, используя определение в module и ModuleSpec 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)

Устанавливает строку документации для 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.

Функции поддержки

Функция инициализации модуля (если используется однофазная инициализация) или функция, вызываемая из слота выполнения модуля (если используется многофазная инициализация), может использовать следующие функции для помощи в инициализации состояния модуля:

int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)

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

Примечание

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

Это означает, что необходимо проверять значение возврата, и код вызывающей программы должен Py_DECREF() значение вручную при ошибке. Пример использования:

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)

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

int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)

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

int PyModule_AddIntMacro(PyObject *module, macro)

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

int PyModule_AddStringMacro(PyObject *module, macro)

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

Поиск модуля

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

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

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.

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

Spec-Zone.ru

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