Содержание страницы
Объекты модулей¶Module Objects
-
PyTypeObject PyModule_Type¶
- Часть Stable 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)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.7.
Возвращает новый объект модуля с
module.__name__, установленным в name. Атрибуты модуля__name__,__doc__,__package__и__loader__заполняются (все, кроме__name__, устанавливаются вNone). Вызывающий отвечает за установку атрибута__file__.Возвращает
NULLс установленным исключением в случае ошибки.Добавлено в версии 3.3.
Изменено в версии 3.4:
__package__и__loader__теперь устанавливаются вNone.
-
PyObject *PyModule_New(const char *name)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Аналогично
PyModule_NewObject(), но имя – строка в кодировке UTF-8, а не объект Unicode.
-
PyObject *PyModule_GetDict(PyObject *module)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Возвращает объект словаря, реализующий пространство имён module; этот объект совпадает с атрибутом
__dict__объекта модуля. Если module не является объектом модуля (или подтипом объекта модуля), возбуждаетсяSystemErrorи возвращаетсяNULL.Расширениям рекомендуется использовать другие функции
PyModule_*иPyObject_*вместо прямого манипулирования__dict__модуля.Возвращаемая ссылка является заимствованной из модуля; она действительна до тех пор, пока модуль не будет уничтожен.
-
PyObject *PyModule_GetNameObject(PyObject *module)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.7.
Возвращает значение
__name__для module. Если модуль не предоставляет такого значения или оно не является строкой, возбуждаетсяSystemErrorи возвращаетсяNULL.Добавлено в версии 3.3.
-
const char *PyModule_GetName(PyObject *module)¶
- Часть Stable ABI.
Аналогично
PyModule_GetNameObject(), но возвращает имя, закодированное в'utf-8'.Возвращаемый буфер действителен только до тех пор, пока модуль не переименован или не уничтожен. Обратите внимание, что код Python может переименовать модуль, установив его атрибут
__name__.
-
void *PyModule_GetState(PyObject *module)¶
- Часть Stable ABI.
Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный при создании модуля, или
NULL. См.PyModuleDef.m_size.
-
PyModuleDef *PyModule_GetDef(PyObject *module)¶
- Часть Stable ABI.
Возвращает указатель на структуру
PyModuleDef, из которой был создан модуль, илиNULL, если модуль не был создан из определения.В случае ошибки возвращает
NULLс установленным исключением. ИспользуйтеPyErr_Occurred(), чтобы отличить этот случай от отсутствияPyModuleDef.
-
PyObject *PyModule_GetFilenameObject(PyObject *module)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает имя файла, из которого был загружен module, используя атрибут
__file__модуля module. Если он не определён или не является строкой, возбуждаетSystemErrorи возвращаетNULL; в противном случае возвращает ссылку на объект Unicode.Добавлено в версии 3.2.
-
const char *PyModule_GetFilename(PyObject *module)¶
- Часть Stable ABI.
Аналогично
PyModule_GetFilenameObject(), но возвращает имя файла, закодированное в 'utf-8'.Возвращаемый буфер действителен только до тех пор, пока атрибут
__file__модуля не будет переназначен или модуль не будет уничтожен.Устарело с версии 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либо запросить «многофазную инициализацию», вернув саму структуру определения.
-
type PyModuleDef¶
- Часть Stable ABI (включая все члены).
Структура определения модуля, содержащая всю информацию, необходимую для создания\nобъекта модуля. Обычно для каждого модуля существует только одна статически\nинициализированная переменная этого типа.
-
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означает, что модуль не поддерживает\nпод-интерпретаторы, так как имеет глобальное состояние.Установка в неотрицательное значение означает, что модуль можно\nпереинициализировать, и указывает дополнительный объём памяти, необходимый\nдля его состояния. Неотрицательное значение
m_sizeтребуется для многофазной\nинициализации.Подробнее см. PEP 3121.
-
PyMethodDef *m_methods¶
Указатель на таблицу функций уровня модуля, описываемых значениями
PyMethodDef. Может бытьNULL, если функции отсутствуют.
-
PyModuleDef_Slot *m_slots¶
Массив определений слотов для многофазной инициализации, завершающийся\nзаписью
{0, NULL}.\nПри использовании однофазной инициализации m_slots должен бытьNULL.
-
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: Больше не вызывается до выделения состояния модуля.
-
PyModuleDef_Base m_base¶
-
PyTypeObject PyModuleDef_Type¶
- Часть Stable ABI начиная с версии 3.5.
Тип объектов
PyModuleDef.
Однофазная инициализация¶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)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Создаёт новый объект модуля на основе определения в def, предполагая версию API module_api_version. Если эта версия не совпадает с версией работающего интерпретатора, генерируется
RuntimeWarning.Возвращает
NULLс установленным исключением в случае ошибки.Примечание
В большинстве случаев вместо этой функции следует использовать
PyModule_Create(); используйте её, только если точно уверены, что она нужна.
Перед возвратом из функции инициализации полученный объект модуля обычно заполняется с помощью таких функций, как PyModule_AddObjectRef().
Многофазная инициализация¶Multi-phase initialization
Альтернативный способ определения расширений – запросить «многофазную инициализацию». Модули расширений, созданные таким образом, ведут себя больше как модули Python: инициализация разделена на фазу создания, когда создаётся объект модуля, и фазу выполнения, когда он заполняется. Различие похоже на методы __new__() и __init__() классов.
В отличие от модулей, созданных с помощью однофазной инициализации, эти модули не являются синглтонами. Например, если запись sys.modules удалена и модуль импортируется заново, создаётся новый объект модуля, который обычно заполняется свежими объектами методов и типов. Старый модуль подлежит обычной сборке мусора. Это отражает поведение чистых модулей Python.
Дополнительные экземпляры модуля могут быть созданы в под-интерпретаторах или после повторной инициализации среды выполнения Python (Py_Finalize() и Py_Initialize()). В таких случаях совместное использование объектов Python между экземплярами модуля, скорее всего, приведёт к сбоям или неопределённому поведению.
Чтобы избежать таких проблем, каждый экземпляр модуля расширения должен быть изолирован: изменения в одном экземпляре не должны неявно влиять на другие, и всё состояние, включая ссылки на объекты Python, должно быть специфичным для конкретного экземпляра модуля. См. Изоляция модулей расширений для подробностей и практического руководства.
A simpler way to avoid these issues is raising an error on repeated initialization.
Все модули, созданные с помощью многофазной инициализации, должны поддерживать под-интерпретаторы или иным образом явно сообщать об отсутствии поддержки. Обычно это достигается изоляцией или блокировкой повторной инициализации, как описано выше. Модуль также может быть ограничен главным интерпретатором с помощью слота Py_mod_multiple_interpreters.
Чтобы запросить многофазную инициализацию, функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef с непустым m_slots. Перед возвратом экземпляр PyModuleDef должен быть инициализирован следующей функцией:
-
PyObject *PyModuleDef_Init(PyModuleDef *def)¶
- Возвращаемое значение: Borrowed reference. Часть Stable ABI начиная с версии 3.5.
Гарантирует, что определение модуля является правильно инициализированным объектом Python, который корректно сообщает свой тип и счётчик ссылок.
Возвращает def, приведённый к
PyObject*, илиNULL, если произошла ошибка.Добавлено в версии 3.5.
Член m_slots определения модуля должен указывать на массив структур PyModuleDef_Slot:
-
type PyModuleDef_Slot¶
- Часть Stable ABI (включая все элементы) начиная с версии 3.5.
-
int slot¶
Идентификатор слота, выбираемый из доступных значений, описанных ниже.
-
void *value¶
Значение слота, смысл которого зависит от идентификатора слота.
Добавлено в версии 3.5.
-
int slot¶
Массив m_slots должен завершаться слотом с id 0.
Доступны следующие типы слотов:
-
Py_mod_create¶
- Часть Stable ABI начиная с версии 3.5.
Задаёт функцию, которая вызывается для создания самого объекта модуля. Указатель 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содержит ненулевыеNULLm_traverse,m_clear,m_free; ненулевойm_size; или слоты, отличные отPy_mod_create.Добавлено в версии 3.5.
-
PyObject *create_module(PyObject *spec, PyModuleDef *def)¶
-
Py_mod_exec¶
- Часть Stable ABI начиная с версии 3.5.
Задаёт функцию, которая вызывается для выполнения модуля. Это эквивалентно выполнению кода модуля Python: обычно эта функция добавляет в модуль классы и константы. Сигнатура функции такова:
Если указано несколько слотов
Py_mod_exec, они обрабатываются в том порядке, в котором расположены в массиве m_slots.Добавлено в версии 3.5.
-
Py_mod_multiple_interpreters¶
- Часть Stable ABI начиная с версии 3.12.
Задаёт одно из следующих значений:
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED¶
Модуль не поддерживает импорт в подынтерпретаторах.
-
Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED¶
Модуль поддерживает импорт в подынтерпретаторах, но только если они используют общий GIL основного интерпретатора. (См. Изоляция модулей расширения.)
-
Py_MOD_PER_INTERPRETER_GIL_SUPPORTED¶
Модуль поддерживает импорт в подынтерпретаторах, даже если у них собственный GIL. (См. Изоляция модулей расширения.)
Этот слот определяет, будет ли импорт этого модуля в подынтерпретаторе завершаться ошибкой.
В одном определении модуля нельзя указывать несколько слотов
Py_mod_multiple_interpreters.Если
Py_mod_multiple_interpretersне указан, механизм импорта по умолчанию используетPy_MOD_MULTIPLE_INTERPRETERS_SUPPORTED.Добавлено в версии 3.12.
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED¶
-
Py_mod_gil¶
- Часть Stable ABI, начиная с версии 3.13.
Задаёт одно из следующих значений:
-
Py_MOD_GIL_USED¶
Модуль зависит от наличия глобальной блокировки интерпретатора (GIL), и может обращаться к глобальному состоянию без синхронизации.
-
Py_MOD_GIL_NOT_USED¶
Модуль можно безопасно использовать без активного GIL.
Этот слот игнорируется сборками Python, не настроенными с
--disable-gil. В противном случае он определяет, приведёт ли импорт этого модуля к автоматическому включению GIL. Подробнее см. Free-threaded CPython.В одном определении модуля нельзя указывать несколько слотов
Py_mod_gil.Если
Py_mod_gilне указан, механизм импорта по умолчанию используетPy_MOD_GIL_USED.Добавлено в версии 3.13.
-
Py_MOD_GIL_USED¶
См. PEP 489 для более подробной информации о многофазной инициализации.
Низкоуровневые функции создания модулей ¶Low-level module creation functions
Следующие функции вызываются «под капотом» при использовании многофазной инициализации. Их можно использовать напрямую, например, при динамическом создании объектов модуля. Обратите внимание, что для полной инициализации модуля необходимо вызвать как PyModule_FromDefAndSpec, так и PyModule_ExecDef.
-
PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec)¶
- Возвращаемое значение: новая ссылка.
Создаёт новый объект модуля по определению def и spec (ModuleSpec). Работает так же, как
PyModule_FromDefAndSpec2(), с module_api_version, установленным вPYTHON_API_VERSION.Добавлено в версии 3.5.
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.7.
Создает новый объект модуля по определению из def и ModuleSpec spec, используя версию API module_api_version. Если эта версия не соответствует версии работающего интерпретатора, выдается
RuntimeWarning.Возвращает
NULLс установленным исключением в случае ошибки.Примечание
В большинстве случаев вместо этой функции следует использовать
PyModule_FromDefAndSpec(); используйте её, только если точно уверены, что она нужна.Добавлено в версии 3.5.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def)¶
- Часть Stable ABI начиная с версии 3.7.
Обрабатывает любые слоты выполнения (
Py_mod_exec), заданные в def.Добавлено в версии 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring)¶
- Часть Stable ABI начиная с версии 3.7.
Устанавливает docstring для module равным docstring. Эта функция вызывается автоматически при создании модуля из
PyModuleDefс помощьюPyModule_CreateилиPyModule_FromDefAndSpec.Возвращает
0при успехе. Возвращает-1с установленным исключением при ошибке.Добавлено в версии 3.5.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)¶
- Часть Stable ABI начиная с версии 3.7.
Добавляет функции из массива functions, завершающегося
NULL, в module. Подробнее об отдельных элементах см. документациюPyMethodDef(из-за отсутствия общего пространства имён модуля «функции» уровня модуля, реализованные на C, обычно получают сам модуль в качестве первого параметра, что делает их похожими на методы экземпляра классов Python). Эта функция вызывается автоматически при создании модуля изPyModuleDefс помощьюPyModule_CreateилиPyModule_FromDefAndSpec.Массив functions должен быть статически выделен (или иным образом гарантированно переживать объект модуля).
Добавлено в версии 3.5.
Вспомогательные функции¶Support functions
Функция инициализации модуля (при однофазной инициализации) или функция, вызываемая из слота выполнения модуля (при многофазной инициализации), могут использовать следующие функции для инициализации состояния модуля:
-
int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)¶
- Часть Stable ABI начиная с версии 3.10.
Добавляет объект в module как name. Это удобная функция, которую можно использовать из функции инициализации модуля.
При успехе возвращает
0. При ошибке вызывает исключение и возвращает-1.Пример использования:
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; }
Для удобства функция принимает
NULLvalue с установленным исключением. В этом случае возвращает-1и просто оставляет вызванное исключение без изменений.Пример можно также написать без явной проверки, что 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.Количество различных строк name, передаваемых этой функции, должно быть небольшим – обычно используйте только статически выделенные строки в качестве name. Для имен, неизвестных во время компиляции, предпочтительнее вызывать
PyUnicode_FromString()иPyObject_SetAttr()напрямую. Подробнее см.PyUnicode_InternFromString(), который может использоваться внутри для создания объекта ключа.Добавлено в версии 3.10.
-
int PyModule_Add(PyObject *module, const char *name, PyObject *value)¶
- Часть Stable ABI, начиная с версии 3.13.
Похожа на
PyModule_AddObjectRef(), но “крадет” ссылку на value (даже при ошибке). Её можно вызывать с результатом функции, возвращающей новую ссылку, не беспокоясь о проверке результата или даже сохранении его в переменную.Пример использования:
if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) { goto error; }
Добавлено в версии 3.13.
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)¶
- Часть Stable ABI.
Похоже на
PyModule_AddObjectRef(), но при успехе присваивает ссылку на value (если возвращает0).Рекомендуются новые функции
PyModule_Add()иPyModule_AddObjectRef(), поскольку неправильное использованиеPyModule_AddObject()может легко привести к утечкам ссылок.Примечание
В отличие от других функций, крадущих ссылки,
PyModule_AddObject()освобождает ссылку на value только при успехе.Это означает, что возвращаемое значение необходимо проверять, а код вызова должен вручную
Py_XDECREF()value при ошибке.Пример использования:
PyObject *obj = PyBytes_FromString(value); if (PyModule_AddObject(module, "spam", obj) < 0) { // Если 'obj' не NULL и PyModule_AddObject() завершился неудачей, // сильную ссылку 'obj' необходимо удалить с помощью Py_XDECREF(). // Если 'obj' равен NULL, Py_XDECREF() ничего не делает. Py_XDECREF(obj); goto error; } // PyModule_AddObject() перехватил ссылку на obj: // Py_XDECREF(obj) здесь не требуется.
Мягкое устаревание начиная с версии 3.13.
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value)¶
- Часть Stable ABI.
Добавляет целочисленную константу в module под именем name. Эту удобную функцию можно использовать из функции инициализации модуля. Возвращает
-1с установленным исключением при ошибке,0при успехе.Это удобная функция, которая вызывает
PyLong_FromLong()иPyModule_AddObjectRef(); подробнее см. их документацию.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)¶
- Часть Stable ABI.
Добавляет строковую константу в module под именем name. Эту удобную функцию можно использовать из функции инициализации модуля. Строка value должна быть завершена символами
NULL. Возвращает-1с установленным исключением при ошибке,0при успехе.Это удобная функция, которая вызывает
PyUnicode_InternFromString()иPyModule_AddObjectRef(); подробнее см. их документацию.
-
PyModule_AddIntMacro(module, macro)¶
Добавляет целочисленную константу в module. Имя и значение берутся из macro. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет целочисленную константу AF_INET со значением AF_INET в module. Возвращает-1с установленным исключением при ошибке,0при успехе.
-
PyModule_AddStringMacro(module, macro)¶
Добавляет строковую константу в module.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type)¶
- Часть Stable ABI начиная с версии 3.10.
Добавляет объект типа в module. Объект типа финализируется внутренним вызовом
PyType_Ready(). Имя объекта типа берётся из последнего компонентаtp_nameпосле точки. Возвращает-1с установленным исключением при ошибке,0при успехе.Добавлено в версии 3.9.
-
int PyUnstable_Module_SetGIL(PyObject *module, void *gil)¶
- Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.
Указывает, поддерживает ли module работу без глобальной блокировки интерпретатора (GIL), используя одно из значений из
Py_mod_gil. Должна быть вызвана во время функции инициализации module. Если эта функция не вызывается при инициализации модуля, механизм импорта считает, что модуль не поддерживает работу без GIL. Эта функция доступна только в сборках Python, сконфигурированных с--disable-gil. Возвращает-1с установленным исключением в случае ошибки,0при успехе.Добавлено в версии 3.13.
Поиск модуля ¶Module lookup
Однофазная инициализация создаёт модули-одиночки, которые можно найти в контексте текущего интерпретатора. Это позволяет впоследствии получить объект модуля, имея только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с помощью многофазной инициализации, поскольку из одного определения можно создать несколько таких модулей.
-
PyObject *PyState_FindModule(PyModuleDef *def)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Возвращает объект модуля, созданный из def для текущего интерпретатора. Этот метод требует, чтобы объект модуля был предварительно прикреплён к состоянию интерпретатора с помощью
PyState_AddModule(). Если соответствующий объект модуля не найден или ещё не прикреплён к состоянию интерпретатора, он возвращаетNULL.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def)¶
- Часть Stable ABI начиная с версии 3.3.
Прикрепляет объект модуля, переданный функции, к состоянию интерпретатора. Это позволяет обращаться к объекту модуля через
PyState_FindModule().Действует только на модули, созданные с помощью однофазной инициализации.
Python автоматически вызывает
PyState_AddModuleпосле импорта модуля, поэтому её вызов из кода инициализации модуля излишен (но безвреден). Явный вызов требуется только в том случае, если собственный код инициализации модуля впоследствии вызываетPyState_FindModule. Функция в основном предназначена для реализации альтернативных механизмов импорта (путём прямого вызова или обращения к её реализации для получения информации о требуемых обновлениях состояния).Вызывающий код должен удерживать GIL.
Возвращает
-1с установленным исключением при ошибке,0при успехе.Добавлено в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def)¶
- Часть Stable ABI начиная с версии 3.3.
Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает
-1с установленным исключением при ошибке,0при успехе.Вызывающий код должен удерживать GIL.
Добавлено в версии 3.3.