Содержание страницы
Объекты модулей¶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__.
-
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().
Определение модуля¶Module definition
Модули, создаваемые с помощью C API, обычно определяются массивом структур PySlot, который предоставляет «описание» того, как следует создавать модуль. Подробнее о слотах см. Слоты определения.
Изменено в версии 3.15: Ранее для определения модулей требовалась структура PyModuleDef. Старый способ определения модулей всё ещё доступен: обратитесь к разделу Структура определения модуля или к более ранним версиям этой документации, если вы планируете поддерживать более старые версии Python.
Массив слотов обычно используется для определения «основного» объекта модуля расширения (подробнее см. Определение модулей расширения). Он также может использоваться для динамического создания модулей расширения.
Если не указано иное, один и тот же идентификатор слота не может повторяться в массиве слотов.
Слоты метаданных¶Metadata slots
-
Py_mod_name¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля имени нового модуля в виде NUL-терминированной строки в кодировке UTF-8const char *.Обратите внимание, что модули обычно создаются с помощью
ModuleSpec, и в этом случае имя из спецификации будет использоваться вместоPy_mod_name. Однако по-прежнему рекомендуется включать этот слот для интроспекции и отладки.Добавлено в версии 3.15: Используйте
PyModuleDef.m_nameдля поддержки предыдущих версий.
-
Py_mod_doc¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля строки документации нового модуля в виде NUL-терминированной строки в кодировке UTF-8const char *.Обычно она устанавливается в переменную, созданную с помощью
PyDoc_STRVAR.Добавлено в версии 3.15: Используйте
PyModuleDef.m_docдля поддержки предыдущих версий.
Слоты возможностей¶Feature slots
-
Py_mod_abi¶
- Часть Stable ABI начиная с версии 3.15.
Slot ID, значение которого указывает на структуруPyABIInfo, описывающую ABI, используемый модулем расширения.Подходящую переменную
PyABIInfoможно определить с помощью макросаPyABIInfo_VAR, например:PyABIInfo_VAR(abi_info); static PySlot mymodule_slots[] = { PySlot_DATA(Py_mod_abi, &abi_info), ... };
При создании модуля Python проверяет значение этого слота с помощью
PyABIInfo_Check().Этот слот обязателен, за исключением модулей, созданных из
PyModuleDef.Добавлено в версии 3.15.
-
Py_mod_multiple_interpreters¶
- Часть Stable ABI начиная с версии 3.12.
Slot ID, значение которого – одно из:-
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_SUPPORTED.По историческим причинам значения объявлены как указатели (
void *). При использовании массивовPySlotиспользуйтеPySlot_DATAдляPy_mod_multiple_interpreters:PySlot_DATA(Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED)
Добавлено в версии 3.12.
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED¶
-
Py_mod_gil¶
- Часть Stable ABI, начиная с версии 3.13.
Slot ID, значение которого – одно из:-
Py_MOD_GIL_USED¶
Модуль зависит от наличия глобальной блокировки интерпретатора (GIL), и может обращаться к глобальному состоянию без синхронизации.
-
Py_MOD_GIL_NOT_USED¶
Модуль можно безопасно использовать без активного GIL.
Этот слот игнорируется сборками Python, не настроенными с
--disable-gil. В противном случае он определяет, приведёт ли импорт этого модуля к автоматическому включению GIL. Подробнее см. Free-threaded CPython.Если
Py_mod_gilне указан, механизм импорта по умолчанию используетPy_MOD_GIL_USED.По историческим причинам значения объявлены как указатели (
void *). При использовании массивовPySlotиспользуйтеPySlot_DATAдляPy_mod_gil:PySlot_DATA(Py_mod_gil, Py_MOD_GIL_NOT_USED)
Добавлено в версии 3.13.
-
Py_MOD_GIL_USED¶
Слоты создания и инициализации¶Creation and initialization slots
-
Py_mod_create¶
- Часть Stable ABI начиная с версии 3.5.
Slot ID– для функции, создающей сам объект модуля. Функция должна иметь сигнатуру:-
PyObject *create_module(PyObject *spec, PyModuleDef *def)¶
Функции будут переданы:
spec: объект, подобный
ModuleSpec, то есть любые определённые дляimportlib.machinery.ModuleSpecатрибуты имеют соответствующую семантику. Однако любой из атрибутов может отсутствовать.def:
NULLили определение модуля, если модуль создан из него.
Функция должна возвращать новый объект модуля или установить ошибку и вернуть
NULL.Эта функция должна быть минимальной. В частности, она не должна вызывать произвольный код Python, так как повторная попытка импорта того же модуля может привести к бесконечному циклу.
Если
Py_mod_createне указан, механизм импорта создаст обычный объект модуля с помощьюPyModule_New(). Имя берётся из spec, а не из определения, чтобы расширения могли динамически подстраиваться под своё место в иерархии модулей и импортироваться под другими именами через симлинки, оставаясь привязанными к одному определению модуля.Возвращаемый объект не обязательно должен быть экземпляром
PyModule_Type. Однако некоторые слоты могут использоваться только с экземплярамиPyModule_Type; в частности:слоты состояния модуля (
Py_mod_state_*),
Добавлено в версии 3.5.
Изменено в версии 3.15: Аргумент слоты может быть объектом, подобным
ModuleSpec, а не настоящим экземпляромModuleSpec. Обратите внимание: предыдущие версии CPython этого не требовали.Аргумент def теперь может быть
NULL, так как модули не обязательно создаются из определений. -
PyObject *create_module(PyObject *spec, PyModuleDef *def)¶
-
Py_mod_exec¶
- Часть Stable ABI начиная с версии 3.5.
Slot ID– для функции, которая будет выполнять (инициализировать) модуль. Эта функция выполняет то же, что и выполнение кода модуля Python: обычно она добавляет классы и константы в модуль. Сигнатура функции:См. раздел Вспомогательные функции с полезными функциями для вызова.
Для обратной совместимости массив
PyModuleDef.m_slotsможет содержать несколько слотовPy_mod_exec; они обрабатываются в порядке появления в массиве. В других местах (то есть в аргументахPyModule_FromSlotsAndSpec()и возвращаемых значенияхPyModExport_<name>) повторение слота не допускается.Добавлено в версии 3.5.
Изменено в версии 3.15: Повторяющиеся слоты
Py_mod_execзапрещены, за исключениемPyModuleDef.m_slots.
-
Py_mod_methods¶
- Часть Stable ABI начиная с версии 3.15.
Slot ID– для таблицы функций уровня модуля, как массив значенийPyMethodDef, подходящих в качестве аргумента functions дляPyModule_AddFunctions().Как и другие идентификаторы слотов, массив слотов может содержать только одну запись
Py_mod_methods. Чтобы добавить функции из нескольких массивовPyMethodDef, вызывайтеPyModule_AddFunctions()в функцииPy_mod_exec.Таблица должна быть статически выделена (или иным образом гарантированно пережить объект модуля).
Добавлено в версии 3.15: Используйте
PyModuleDef.m_methodsдля поддержки предыдущих версий.
Состояние модуля ¶Module state
Модули расширения могут иметь состояние модуля – фрагмент памяти, который выделяется при создании модуля и освобождается при удалении объекта модуля. Состояние модуля задаётся с помощью специализированных слотов.
Типичное применение состояния модуля – хранение типа исключения или любого объекта типа, определённого модулем –
В отличие от атрибутов модуля Python, код Python не может заменить или удалить данные, хранящиеся в состоянии модуля.
Хранение информации о модуле в атрибутах и состоянии модуля, а не в статических глобальных переменных, делает объекты модулей изолированными и более безопасными для использования в нескольких под-интерпретаторах. Это также помогает Python выполнять упорядоченную очистку при завершении работы.
Расширения, которые хранят ссылки на объекты Python как часть состояния модуля, должны
реализовывать Py_mod_state_traverse и Py_mod_state_clear
функции, чтобы избежать утечек ссылок.
Чтобы получить состояние из данного модуля, используйте следующие функции:
-
void *PyModule_GetState(PyObject *module)¶
- Часть Stable ABI.
Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный при создании модуля, или
NULL. См.Py_mod_state_size.При ошибке возвращает
NULLс установленным исключением. ИспользуйтеPyErr_Occurred(), чтобы отличить этот случай от отсутствующего состояния модуля.
-
int PyModule_GetStateSize(PyObject *module, Py_ssize_t *result)¶
- Часть Stable ABI начиная с версии 3.15.
Устанавливает *result в размер состояния module, как задано с помощью
Py_mod_state_size(илиPyModuleDef.m_size), и возвращает 0.При ошибке устанавливает *result в -1 и возвращает -1 с установленным исключением.
Добавлено в версии 3.15.
Слоты для определения состояния модуля ¶Slots for defining module state
Следующие slot IDs доступны для
определения состояния модуля.
-
Py_mod_state_size¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля размера состояния модуля в байтах.Установка значения в неотрицательное число означает, что модуль может быть повторно инициализирован, и задаёт дополнительный объём памяти, необходимый для его состояния.
Подробнее см. PEP 3121.
Используйте
PyModule_GetStateSize()для получения размера данного модуля.Добавлено в версии 3.15: Используйте
PyModuleDef.m_sizeдля поддержки предыдущих версий.
-
Py_mod_state_traverse¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля функции обхода, вызываемой при обходе GC объекта модуля.Сигнатура функции и значения аргументов аналогичны
PyTypeObject.tp_traverse:Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Это происходит сразу после создания модуля и до его выполнения (функция
Py_mod_exec). Точнее, эта функция не вызывается, если размер состояния (Py_mod_state_size) больше 0 и состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Добавлено в версии 3.15: Используйте
PyModuleDef.m_traverseдля поддержки предыдущих версий.
-
Py_mod_state_clear¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля функции очистки, вызываемой при очистке GC объекта модуля.Сигнатура функции:
Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Это происходит сразу после создания модуля и до его выполнения (функция
Py_mod_exec). Точнее, эта функция не вызывается, если размер состояния (Py_mod_state_size) больше 0 и состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Как и
PyTypeObject.tp_clear, эта функция не всегда вызывается перед освобождением модуля. Например, когда подсчёта ссылок достаточно, чтобы определить, что объект больше не используется, циклический сборщик мусора не задействуется и функцияPy_mod_state_freeвызывается напрямую.Добавлено в версии 3.15: Используйте
PyModuleDef.m_clearдля поддержки предыдущих версий.
-
Py_mod_state_free¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля функции, вызываемой при освобождении объекта модуля.Сигнатура функции:
Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Это происходит сразу после создания модуля и до его выполнения (функция
Py_mod_exec). Точнее, эта функция не вызывается, если размер состояния (Py_mod_state_size) больше 0 и состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Добавлено в версии 3.15: Используйте
PyModuleDef.m_freeдля поддержки предыдущих версий.
Токен модуля¶Module token
Каждый модуль может иметь связанный токен: значение размером с указатель, предназначенное для идентификации расположения памяти состояния модуля. Это означает, что если у вас есть объект модуля, но вы не уверены, «принадлежит» ли он вашему расширению, вы можете проверить это с помощью такого кода:
PyObject *module = <the module in question>
void *module_token;
if (PyModule_GetToken(module, &module_token) < 0) {
return NULL;
}
if (module_token != your_token) {
PyErr_SetString(PyExc_ValueError, "unexpected module")
return NULL;
}
// Состояние этого модуля имеет ожидаемую структуру памяти; приведение типов безопасно.
struct my_state state = (struct my_state*)PyModule_GetState(module)
Токен модуля – и значение your_token для использования в приведённом выше коде – это:
Для модулей, созданных с помощью
PyModuleDef: адрес этогоPyModuleDef;Для модулей, определённых с помощью слота
Py_mod_token: значение этого слота;Для модулей, созданных из
PyModExport_*экспортного хука: массив слотов, который вернул экспортный хук (если не переопределён с помощьюPy_mod_token).
-
Py_mod_token¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля токена модуля.Если вы используете этот слот для установки токена модуля (а не полагаетесь на значение по умолчанию), вы должны убедиться в следующем:
Указатель переживает класс, чтобы он не был повторно использован для чего-то другого пока класс существует.
Он «принадлежит» тому модулю расширения, где находится класс, чтобы не конфликтовать с другими расширениями.
Если токен указывает на структуру
PyModuleDef, модуль должен вести себя так, как если бы он был создан из этойPyModuleDef. В частности, состояние модуля должно иметь соответствующую структуру и семантику.
Модули, созданные из
PyModuleDef, всегда используют адресPyModuleDefв качестве токена. Это означает, чтоPy_mod_tokenне может использоваться вPyModuleDef.m_slots.Добавлено в версии 3.15.
-
int PyModule_GetToken(PyObject *module, void **result)¶
- Часть Stable ABI начиная с версии 3.15.
Устанавливает *result в токен модуля для module и возвращает 0.
В случае ошибки устанавливает *result в NULL и возвращает -1 с установленным исключением.
Добавлено в версии 3.15.
См. также PyType_GetModuleByToken().
Создание модулей расширения динамически¶Creating extension modules dynamically
Следующие функции могут использоваться для динамического создания модуля расширения, а не из экспортного хука расширения.
-
PyObject *PyModule_FromSlotsAndSpec(const PySlot *slots, PyObject *spec)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.15.
Создаёт новый объект модуля, принимая массив слотов и
ModuleSpecspec.Аргумент slots должен указывать на массив структур
PySlotструктур, завершающийся записью с ID слота 0 (обычно записывается какPySlot_END). Массив должен содержать записьPy_mod_abi.Аргумент spec может быть любым объектом, подобным
ModuleSpec, как описано в документацииPy_mod_create. В текущей версии spec должен иметь атрибутname.При успехе возвращает новый модуль. При ошибке возвращает
NULLс установленным исключением.Обратите внимание: эта функция не обрабатывает слот выполнения модуля (
Py_mod_exec). Для полной инициализации модуля необходимо вызвать какPyModule_FromSlotsAndSpec(), так иPyModule_Exec(). (См. также многофазную инициализацию.)Добавлено в версии 3.15.
-
int PyModule_Exec(PyObject *module)¶
- Часть Stable ABI начиная с версии 3.15.
Выполняет слот(ы)
Py_mod_execмодуля module.При успехе возвращает 0. При ошибке возвращает -1 с установленным исключением.
Для ясности: если у module нет слотов, например, если используется однофазная инициализация (устаревшая), то эта функция ничего не делает и возвращает 0.
Добавлено в версии 3.15.
Структура определения модуля¶Module definition struct
Традиционно модули расширения определялись с помощью определения модуля как «описания» того, как должен создаваться модуль. Вместо прямого использования массива слотов определение содержит выделенные поля для наиболее распространённой функциональности и допускает дополнительные слоты как механизм расширения.
Этот способ определения модулей по-прежнему доступен, и удалять его не планируется.
-
type PyModuleDef¶
- Часть Stable ABI (см. ниже).
Структура определения модуля, содержащая информацию, необходимую для создания объекта модуля.
Эта структура должна быть статически размещена (или иным образом гарантированно оставаться действительной, пока существуют созданные из неё модули). Обычно для каждого модуля расширения, определённого таким образом, существует только одна переменная этого типа.
Структура, включая все поля, является частью Stable ABI для сборок без свободных потоков (
abi3). В Stable ABI для сборок со свободными потоками (abi3t) эта структура непрозрачна и практически непригодна к использованию; см. Module definition для замены.-
PyModuleDef_Base m_base¶
Всегда инициализируйте этот элемент значением
PyModuleDef_HEAD_INIT:-
type PyModuleDef_Base¶
- Часть Stable ABI (см. ниже).
Тип
PyModuleDef.m_base.Структура является частью Stable ABI для сборок без свободных потоков (
abi3). В Stable ABI для сборок со свободными потоками (abi3t) эта структура непрозрачна и практически непригодна к использованию.
-
PyModuleDef_HEAD_INIT¶
Требуемое начальное значение для
PyModuleDef.m_base.
-
type PyModuleDef_Base¶
-
const char *m_name¶
Соответствует слоту
Py_mod_name.
-
const char *m_doc¶
Эти элементы соответствуют слоту
Py_mod_doc. Установка в NULL равнозначна опусканию слота.
-
Py_ssize_t m_size¶
Соответствует слоту
Py_mod_state_size. Установка в ноль равнозначна опусканию слота.При использовании однофазной инициализации (устаревшей) или при динамическом создании модулей с помощью
PyModule_Create()илиPyModule_Create2(),m_sizeможет быть установлен в -1. Это указывает на то, что модуль не поддерживает под-интерпретаторы, поскольку имеет глобальное состояние.
-
PyMethodDef *m_methods¶
Соответствует слоту
Py_mod_methods. Установка в NULL равнозначна опусканию слота.
-
PyModuleDef_Slot *m_slots¶
Массив дополнительных слотов, завершающийся элементом
{0, NULL}. Обратите внимание, что элементы используют более старую структуруPyModuleDef_Slot, а неPySlot.Если массив содержит слоты, соответствующие элементам
PyModuleDef, значения должны совпадать. Например, если используетсяPy_mod_nameвm_slots,PyModuleDef.m_nameдолжен быть установлен на тот же указатель (а не просто на равную строку).Изменено в версии 3.5: До версии 3.5 этот элемент всегда устанавливался в
NULL, и определялся как:-
type PyModuleDef_Slot¶
- Часть Stable ABI (включая все элементы) начиная с версии 3.5.
Более старая структура, определяющая дополнительные слоты модуля.
Обратите внимание, что массив
PyModuleDef_Slotможет быть включён в массивPySlotс помощьюPy_mod_slots, и наоборот с помощьюPy_slot_subslots.Каждая структура
PyModuleDef_Slotmodslotинтерпретируется как следующая структураPySlot:(PySlot){ .sl_id=modslot.slot, .sl_flags=PySlot_INTPTR | sub_static, .sl_ptr=modslot.value }
где
sub_staticравноPySlot_STATIC, если слот требует флаг (например, дляPy_mod_methods), или если этот флаг присутствует в «родительском» слотеPy_mod_slots(если есть).-
int slot¶
Соответствует
PySlot.sl_id.
-
void *value¶
Соответствует
PySlot.sl_ptr.
Добавлено в версии 3.5.
-
int slot¶
-
type PyModuleDef_Slot¶
-
traverseproc m_traverse¶
-
inquiry m_clear¶
-
freefunc m_free¶
Эти элементы соответствуют слотам
Py_mod_state_traverse,Py_mod_state_clearиPy_mod_state_free, соответственно.Установка этих элементов в NULL равнозначна пропуску соответствующих слотов.
Изменено в версии 3.9: Функции
m_traverse,m_clearиm_freeбольше не вызываются до выделения состояния модуля.
-
PyModuleDef_Base m_base¶
-
PyTypeObject PyModuleDef_Type¶
- Часть Stable ABI начиная с версии 3.5.
Тип объектов
PyModuleDef.
-
Py_mod_slots¶
- Часть Stable ABI начиная с версии 3.15.
Slot ID, который работает какPy_slot_subslots, за исключением того, что он задаёт массив структурPyModuleDef_Slot.Добавлено в версии 3.15.
Следующий API можно использовать для создания модулей из структуры PyModuleDef:
-
PyObject *PyModule_Create(PyModuleDef *def)¶
- Возвращаемое значение: новая ссылка.
Создаёт новый объект модуля на основе определения в def. Это макрос, который вызывает
PyModule_Create2()с module_api_version, установленным вPYTHON_API_VERSION, или вPYTHON_ABI_VERSION, если используется ограниченный API.
-
PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Создаёт новый объект модуля на основе определения в def, предполагая версию API module_api_version. Если эта версия не совпадает с версией работающего интерпретатора, генерируется
RuntimeWarning.Возвращает
NULLс установленным исключением в случае ошибки.Эта функция не поддерживает слоты. Элемент
m_slotsструктуры def должен быть равенNULL.Примечание
В большинстве случаев вместо этой функции следует использовать
PyModule_Create(); используйте её, только если точно уверены, что она нужна.
-
PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec)¶
- Возвращаемое значение: новая ссылка.
Этот макрос вызывает
PyModule_FromDefAndSpec2()с module_api_version, установленным вPYTHON_API_VERSION, или вPYTHON_ABI_VERSION, если используется ограниченный API.Добавлено в версии 3.5.
Мягко устарело начиная с версии 3.15.0b3 (не выпущена): В новом коде рекомендуется использовать
PyModule_FromSlotsAndSpec().
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.7.
Создает новый объект модуля по определению из def и ModuleSpec spec, используя версию API module_api_version. Если эта версия не соответствует версии работающего интерпретатора, выдается
RuntimeWarning.Возвращает
NULLс установленным исключением в случае ошибки.Обратите внимание, что это не обрабатывает слоты выполнения (
Py_mod_exec). Для полной инициализации модуля необходимо вызвать какPyModule_FromDefAndSpec, так иPyModule_ExecDef.Примечание
В большинстве случаев вместо этой функции следует использовать
PyModule_FromDefAndSpec(); используйте её, только если точно уверены, что она нужна.Добавлено в версии 3.5.
Мягко устарело начиная с версии 3.15.0b3 (не выпущена): В новом коде рекомендуется использовать
PyModule_FromSlotsAndSpec().
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def)¶
- Часть Stable ABI начиная с версии 3.7.
Обрабатывает любые слоты выполнения (
Py_mod_exec), заданные в def.Добавлено в версии 3.5.
Мягко устарело с версии 3.15.0b3 (невыпущенная): Для запуска собственных слотов выполнения модуля предпочтительнее использовать
PyModule_Exec(), которая работает с модулями, не созданными из структурыPyModuleDef.
Вспомогательные функции¶Support functions
Следующие функции предоставляются для помощи в инициализации объекта модуля.
Они предназначены для слота выполнения модуля (Py_mod_exec),
функции инициализации для устаревшей однофазной инициализации,
или кода, создающего модули динамически.
-
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 PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)¶
- Часть Stable ABI начиная с версии 3.7.
Добавляет функции из массива functions, завершённого
NULL, в module. Подробнее об отдельных записях см. документациюPyMethodDef(из-за отсутствия общего пространства имён модуля функции уровня модуля, реализованные на C, обычно получают модуль в качестве первого параметра, что делает их похожими на методы экземпляров классов Python).Эта функция вызывается автоматически при создании модуля из
PyModuleDef(например, при использовании многофазной инициализации,PyModule_CreateилиPyModule_FromDefAndSpec). Некоторые авторы модулей могут предпочитать определять функции в нескольких массивахPyMethodDef; в этом случае им следует вызывать эту функцию напрямую.Массив functions должен быть статически выделен (или иным образом гарантированно переживать объект модуля).
Добавлено в версии 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 PyUnstable_Module_SetGIL(PyObject *module, void *gil)¶
- Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.
Указывает, поддерживает ли module работу без глобальной блокировки интерпретатора (GIL), используя одно из значений из
Py_mod_gil. Необходимо вызывать в функции инициализации module при использовании устаревшей однофазной инициализации. Если эта функция не вызывается во время инициализации модуля, механизм импорта считает, что модуль не поддерживает работу без GIL. Эта функция доступна только в сборках Python, настроенных с--disable-gil. Возвращает-1с установленным исключением при ошибке,0при успехе.Добавлено в версии 3.13.
Поиск модуля (однофазная инициализация)¶Module lookup (single-phase initialization)
Устаревшая схема однофазной инициализации создаёт модули-одиночки, которые можно найти в контексте текущего интерпретатора. Это позволяет позже получить объект модуля, имея только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с помощью многофазной инициализации, поскольку из одного определения можно создать несколько таких модулей.
-
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. Функция в основном предназначена для реализации альтернативных механизмов импорта (путём непосредственного вызова или обращения к её реализации за подробностями требуемых обновлений состояния).Если модуль был ранее прикреплён с помощью того же def, он заменяется новым module.
Вызывающий должен иметь прикреплённое состояние потока.
Возвращает
-1с установленным исключением при ошибке,0при успехе.Добавлено в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def)¶
- Часть Stable ABI начиная с версии 3.3.
Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает
-1с установленным исключением при ошибке,0при успехе.Вызывающий должен иметь прикреплённое состояние потока.
Добавлено в версии 3.3.