Spec-Zone.ru › Python 3.13

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

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

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

int PyModule_Check(PyObject *p)

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

int PyModule_CheckExact(PyObject *p)

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

PyObject *PyModule_NewObject(PyObject *name)
Возвращаемое значение: новая сильная ссылка. Часть стабильного 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)
Возвращаемое значение: новая сильная ссылка. Часть стабильного 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. Если этот атрибут не определён или не является строкой, возникает исключение SystemError и возвращается NULL; в противном случае возвращается ссылка на объект Unicode.

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

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

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

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

Инициализация модулей 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

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

При ошибке возвращает NULL с установленным исключением.

Примечание

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

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

Многоэтапная инициализация

Другой способ задания модулей расширения — запросить «многоэтапную инициализацию». Созданные таким образом модули расширения ведут себя более похоже на модули Python: инициализация разделена на этап создания, на котором создаётся объект модуля, и этап выполнения, на котором он заполняется. Это различие аналогично методам __new__() и __init__() классов.

В отличие от модулей, созданных с помощью одноэтапной инициализации, такие модули не являются синглтонами. Например, если удалить запись sys.modules и импортировать модуль повторно, будет создан новый объект модуля, обычно заполненный новыми объектами методов и типов. Старый модуль подлежит обычной сборке мусора. Такое поведение соответствует поведению модулей на чистом Python.

Дополнительные экземпляры модуля могут создаваться в субинтерпретаторах или после повторной инициализации среды выполнения Python (Py_Finalize() и Py_Initialize()). В этих случаях совместное использование объектов Python экземплярами модуля, вероятно, приведёт к сбоям или неопределённому поведению.

Чтобы избежать подобных проблем, каждый экземпляр модуля расширения должен быть изолирован: изменения одного экземпляра не должны неявно влиять на остальные, а всё состояние, включая ссылки на объекты Python, должно относиться к конкретному экземпляру модуля. Подробнее и практическое руководство см. в разделе Изоляция модулей расширения.

Более простой способ избежать подобных проблем — выдавать ошибку при повторной инициализации.

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

Чтобы запросить многоэтапную инициализацию, функция инициализации (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.

Py_mod_multiple_interpreters

Задаёт одно из следующих значений:

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_gil

Задаёт одно из следующих значений:

Py_MOD_GIL_USED

Модуль зависит от наличия глобальной блокировки интерпретатора (GIL) и может обращаться к глобальному состоянию без синхронизации.

Py_MOD_GIL_NOT_USED

Модуль безопасно работает без активной GIL.

Этот слот игнорируется сборками Python, сконфигурированными без --disable-gil. В противном случае он определяет, приведёт ли импорт данного модуля к автоматическому включению GIL. Подробнее см. в разделе CPython без потоковой блокировки.

В одном определении модуля нельзя указать несколько слотов Py_mod_gil.

Если Py_mod_gil не указан, механизм импорта по умолчанию использует Py_MOD_GIL_USED.

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

Подробнее о многоэтапной инициализации см. в 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.

При ошибке возвращает NULL с установленным исключением.

Примечание

В большинстве случаев следует использовать эту функцию: 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.

Добавляет объект в 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;
 }

Для удобства функция принимает NULL value при установленном исключении. В этом случае возвращается -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)
Входит в стабильный 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)
Входит в стабильный ABI.

Аналогична PyModule_AddObjectRef(), но в случае успеха (если возвращает 0) забирает ссылку на value.

Рекомендуется использовать новые функции PyModule_Add() или PyModule_AddObjectRef(), поскольку при неправильном использовании функции PyModule_AddObject() легко допустить утечку ссылок.

Примечание

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

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

Пример использования:

PyObject *obj = PyBytes_FromString(value);
if (PyModule_AddObject(module, "spam", obj) < 0) {
    // If 'obj' is not NULL and PyModule_AddObject() failed,
    // 'obj' strong reference must be deleted with Py_XDECREF().
    // If 'obj' is NULL, Py_XDECREF() does nothing.
    Py_XDECREF(obj);
    goto error;
}
// PyModule_AddObject() stole a reference to obj:
// Py_XDECREF(obj) is not needed here.

Устарела начиная с версии 3.13: PyModule_AddObject() имеет статус условно устаревшей.

int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
Входит в стабильный ABI.

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

Это вспомогательная функция, которая вызывает PyLong_FromLong() и PyModule_AddObjectRef(); подробности см. в их документации.

int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)
Входит в стабильный ABI.

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

Это вспомогательная функция, которая вызывает PyUnicode_InternFromString() и PyModule_AddObjectRef(); подробности см. в их документации.

PyModule_AddIntMacro(module, macro)

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

PyModule_AddStringMacro(module, macro)

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

int PyModule_AddType(PyObject *module, PyTypeObject *type)
Входит в стабильный 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.

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

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

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

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.

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

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

int PyState_RemoveModule(PyModuleDef *def)
Входит в стабильный ABI начиная с версии 3.3.

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

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

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

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

Spec-Zone.ru

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