Об’єкти модуля

PyTypeObject PyModule_Type
Part of the Stable 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)
Return value: New reference. Part of the Stable ABI since version 3.7.

Повертає новий об’єкт модуля з атрибутом __name__, встановленим на name. Атрибути модуля __name__, __doc__, __package__ і __loader__ заповнюються (для всіх, крім __name__, встановлено значення None); абонент відповідає за надання атрибута __file__.

Added in version 3.3.

Змінено в версії 3.4: __package__ і __loader__ мають значення None.

PyObject *PyModule_New(const char *name)
Return value: New reference. Part of the Stable ABI.

Подібно до PyModule_NewObject(), але ім’я — це рядок у кодуванні UTF-8, а не об’єкт Unicode.

PyObject *PyModule_GetDict(PyObject *module)
Return value: Borrowed reference. Part of the Stable ABI.

Повертає об’єкт словника, який реалізує простір імен module; цей об’єкт збігається з атрибутом __dict__ об’єкта модуля. Якщо module не є об’єктом модуля (або підтипом об’єкта модуля), виникає SystemError і повертається NULL.

It is recommended extensions use other PyModule_* and PyObject_* functions rather than directly manipulate a module’s __dict__.

PyObject *PyModule_GetNameObject(PyObject *module)
Return value: New reference. Part of the Stable ABI since version 3.7.

Повертає значення module __name__. Якщо модуль не надає його або якщо це не рядок, виникає SystemError і повертається NULL.

Added in version 3.3.

const char *PyModule_GetName(PyObject *module)
Part of the Stable ABI.

Подібно до PyModule_GetNameObject(), але повертає назву, закодовану в 'utf-8'.

void *PyModule_GetState(PyObject *module)
Part of the Stable ABI.

Повертає «стан» модуля, тобто вказівник на блок пам’яті, виділений під час створення модуля, або NULL. Перегляньте PyModuleDef.m_size.

PyModuleDef *PyModule_GetDef(PyObject *module)
Part of the Stable ABI.

Повертає вказівник на структуру PyModuleDef, з якої було створено модуль, або NULL, якщо модуль не було створено з визначення.

PyObject *PyModule_GetFilenameObject(PyObject *module)
Return value: New reference. Part of the Stable ABI.

Повертає назву файлу, з якого було завантажено module, використовуючи атрибут module __file__. Якщо це не визначено, або якщо це не рядок Юнікод, викликати SystemError і повернути NULL; інакше повертає посилання на об’єкт Unicode.

Added in version 3.2.

const char *PyModule_GetFilename(PyObject *module)
Part of the Stable ABI.

Подібно до PyModule_GetFilenameObject(), але повертає назву файлу, закодовану як „utf-8“.

Застаріло починаючи з версії 3.2: PyModule_GetFilename() raises UnicodeEncodeError on unencodable filenames, use PyModule_GetFilenameObject() instead.

Ініціалізація модулів C

Об’єкти Modules зазвичай створюються з модулів розширення (спільних бібліотек, які експортують функцію ініціалізації) або скомпільованих модулів (куди функція ініціалізації додається за допомогою PyImport_AppendInittab()). Дивіться Створення розширень C і C++ або Розширення вбудованого Python для деталей.

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

type PyModuleDef
Part of the Stable ABI (including all members).

Структура визначення модуля, яка містить всю інформацію, необхідну для створення об’єкта модуля. Зазвичай існує лише одна статично ініціалізована змінна цього типу для кожного модуля.

PyModuleDef_Base m_base

Always initialize this member to PyModuleDef_HEAD_INIT.

const char *m_name

Назва для нового модуля.

const char *m_doc

Рядок документації для модуля; зазвичай використовується змінна docstring, створена за допомогою PyDoc_STRVAR.

Py_ssize_t m_size

Стан модуля може зберігатися в області пам’яті для кожного модуля, яку можна отримати за допомогою PyModule_GetState(), а не в статичних глобалах. Це робить модулі безпечними для використання в кількох субінтерпретаторах.

This memory area is allocated based on m_size on module creation, and freed when the module object is deallocated, after the m_free function has been called, if present.

Встановлення 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, якщо не потрібна.

This function is not called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (Py_mod_exec function). More precisely, this function is not called if m_size is greater than 0 and the module state (as returned by PyModule_GetState()) is NULL.

Змінено в версії 3.9: Більше не викликається до виділення стану модуля.

inquiry m_clear

Очистити функцію для виклику під час очищення GC об’єкта модуля або NULL, якщо не потрібно.

This function is not called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (Py_mod_exec function). More precisely, this function is not called if m_size is greater than 0 and the module state (as returned by PyModule_GetState()) is NULL.

Як і PyTypeObject.tp_clear, ця функція не завжди викликається до того, як модуль буде звільнено. Наприклад, коли підрахунку посилань достатньо, щоб визначити, що об’єкт більше не використовується, циклічний збирач сміття не задіяний і m_free викликається безпосередньо.

Змінено в версії 3.9: Більше не викликається до виділення стану модуля.

freefunc m_free

Функція для виклику під час звільнення об’єкта модуля або NULL, якщо вона не потрібна.

This function is not called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (Py_mod_exec function). More precisely, this function is not called if m_size is greater than 0 and the module state (as returned by PyModule_GetState()) is NULL.

Змінено в версії 3.9: Більше не викликається до виділення стану модуля.

Однофазна ініціалізація

Функція ініціалізації модуля може створювати та повертати об’єкт модуля безпосередньо. Це називається «однофазною ініціалізацією» та використовує одну з наступних двох функцій створення модуля:

PyObject *PyModule_Create(PyModuleDef *def)
Return value: New reference.

Create a new module object, given the definition in def. This behaves like PyModule_Create2() with module_api_version set to PYTHON_API_VERSION.

PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version)
Return value: New reference. Part of the Stable ABI.

Створіть новий об’єкт модуля, враховуючи визначення в def, припускаючи версію API module_api_version. Якщо ця версія не збігається з версією запущеного інтерпретатора, видається RuntimeWarning.

Примітка

Більшість випадків використання цієї функції має використовувати замість неї PyModule_Create(); використовуйте це, лише якщо ви впевнені, що це вам потрібно.

Перед поверненням у функції ініціалізації результуючий об’єкт модуля зазвичай заповнюється за допомогою таких функцій, як PyModule_AddObjectRef().

Багатофазова ініціалізація

An alternate way to specify extensions is to request «multi-phase initialization». Extension modules created this way behave more like Python modules: the initialization is split between the creation phase, when the module object is created, and the execution phase, when it is populated. The distinction is similar to the __new__() and __init__() methods of classes.

Unlike modules created using single-phase initialization, these modules are not singletons: if the sys.modules entry is removed and the module is re-imported, a new module object is created, and the old module is subject to normal garbage collection – as with Python modules. By default, multiple modules created from the same definition should be independent: changes to one should not affect the others. This means that all state should be specific to the module object (using e.g. using PyModule_GetState()), or its contents (such as the module’s __dict__ or individual classes created with PyType_FromSpec()).

Очікується, що всі модулі, створені за допомогою багатофазної ініціалізації, підтримуватимуть sub-інтерпретатори. Переконавшись, що декілька модулів є незалежними, як правило, достатньо, щоб досягти цього.

Для запиту багатофазної ініціалізації функція ініціалізації (PyInit_modulename) повертає екземпляр PyModuleDef з непорожнім m_slots. Перш ніж його буде повернуто, примірник PyModuleDef має бути ініціалізований такою функцією:

PyObject *PyModuleDef_Init(PyModuleDef *def)
Return value: Borrowed reference. Part of the Stable ABI since version 3.5.

Гарантує, що визначення модуля є правильно ініціалізованим об’єктом Python, який правильно повідомляє про свій тип і кількість посилань.

Повертає def приведення до PyObject* або NULL, якщо сталася помилка.

Added in version 3.5.

Член m_slots у визначенні модуля має вказувати на масив структур PyModuleDef_Slot:

type PyModuleDef_Slot
int slot

Ідентифікатор слота, вибраний із доступних значень, пояснених нижче.

void *value

Значення слота, значення якого залежить від ідентифікатора слота.

Added in version 3.5.

Масив m_slots повинен закінчуватися слотом з ідентифікатором 0.

Доступні типи слотів:

Py_mod_create

Визначає функцію, яка викликається для створення самого об’єкта модуля. Покажчик значення цього слота має вказувати на функцію підпису:

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

Specifies one of the following values:

Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED

The module does not support being imported in subinterpreters.

Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED

The module supports being imported in subinterpreters, but only when they share the main interpreter’s GIL. (See Isolating Extension Modules.)

Py_MOD_PER_INTERPRETER_GIL_SUPPORTED

The module supports being imported in subinterpreters, even when they have their own GIL. (See Isolating Extension Modules.)

This slot determines whether or not importing this module in a subinterpreter will fail.

Multiple Py_mod_multiple_interpreters slots may not be specified in one module definition.

If Py_mod_multiple_interpreters is not specified, the import machinery defaults to Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED.

Added in version 3.12.

Перегляньте PEP 489 для отримання додаткової інформації про багатофазову ініціалізацію.

Функції створення модулів низького рівня

Наступні функції викликаються під капотом під час використання багатофазної ініціалізації. Їх можна використовувати безпосередньо, наприклад, при динамічному створенні об’єктів модуля. Зауважте, що для повної ініціалізації модуля необхідно викликати як PyModule_FromDefAndSpec, так і PyModule_ExecDef.

PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec)
Return value: New reference.

Create a new module object, given the definition in def and the ModuleSpec spec. This behaves like PyModule_FromDefAndSpec2() with module_api_version set to PYTHON_API_VERSION.

Added in version 3.5.

PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)
Return value: New reference. Part of the Stable ABI since version 3.7.

Create a new module object, given the definition in def and the ModuleSpec spec, assuming the API version module_api_version. If that version does not match the version of the running interpreter, a RuntimeWarning is emitted.

Примітка

У більшості випадків використання цієї функції має використовувати PyModule_FromDefAndSpec(); використовуйте це, лише якщо ви впевнені, що це вам потрібно.

Added in version 3.5.

int PyModule_ExecDef(PyObject *module, PyModuleDef *def)
Part of the Stable ABI since version 3.7.

Обробити будь-які слоти виконання (Py_mod_exec), указані в def.

Added in version 3.5.

int PyModule_SetDocString(PyObject *module, const char *docstring)
Part of the Stable ABI since version 3.7.

Встановіть рядок документації для module на string. Ця функція викликається автоматично під час створення модуля з PyModuleDef за допомогою PyModule_Create або PyModule_FromDefAndSpec.

Added in version 3.5.

int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)
Part of the Stable ABI since version 3.7.

Додайте функції з масиву functions із закінченням NULL до module. Зверніться до документації PyMethodDef, щоб дізнатися більше про окремі записи (через відсутність спільного простору імен модуля «функції» рівня модуля, реалізовані в C, зазвичай отримують модуль як свій перший параметр, що робить їх схожими на екземпляр методи на класах Python). Ця функція викликається автоматично під час створення модуля з PyModuleDef за допомогою PyModule_Create або PyModule_FromDefAndSpec.

Added in version 3.5.

Допоміжні функції

Функція ініціалізації модуля (якщо використовується однофазна ініціалізація) або функція, що викликається зі слота виконання модуля (якщо використовується багатофазова ініціалізація), може використовувати такі функції, щоб допомогти ініціалізувати стан модуля:

int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)
Part of the Stable ABI since version 3.10.

Додайте об’єкт до модуля як ім’я. Це зручна функція, яку можна використовувати з функції ініціалізації модуля.

У разі успіху поверніть 0. У разі помилки викликає виняток і повертає -1.

Повертає NULL, якщо значення дорівнює NULL. У цьому випадку його потрібно викликати з винятком.

Приклад використання:

static int
add_spam(PyObject *module, int value)
{
    PyObject *obj = PyLong_FromLong(value);
    if (obj == NULL) {
        return -1;
    }
    int res = PyModule_AddObjectRef(module, "spam", obj);
    Py_DECREF(obj);
    return res;
 }

Приклад також можна написати без явної перевірки, якщо obj має значення NULL:

static int
add_spam(PyObject *module, int value)
{
    PyObject *obj = PyLong_FromLong(value);
    int res = PyModule_AddObjectRef(module, "spam", obj);
    Py_XDECREF(obj);
    return res;
 }

Зверніть увагу, що в цьому випадку слід використовувати Py_XDECREF() замість Py_DECREF(), оскільки obj може бути NULL.

Added in version 3.10.

int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)
Part of the Stable ABI.

Подібно до PyModule_AddObjectRef(), але в разі успіху викрадає посилання на value (якщо повертає 0).

Рекомендовано використовувати нову функцію PyModule_AddObjectRef(), оскільки внаслідок неправильного використання функції PyModule_AddObject() легко створити витоки посилань.

Примітка

Unlike other functions that steal references, PyModule_AddObject() only releases the reference to value on success.

Це означає, що його повертане значення має бути перевірено, а код виклику повинен Py_DECREF() значення вручну у разі помилки.

Приклад використання:

static int
add_spam(PyObject *module, int value)
{
    PyObject *obj = PyLong_FromLong(value);
    if (obj == NULL) {
        return -1;
    }
    if (PyModule_AddObject(module, "spam", obj) < 0) {
        Py_DECREF(obj);
        return -1;
    }
    // PyModule_AddObject() stole a reference to obj:
    // Py_DECREF(obj) is not needed here
    return 0;
}

Приклад також можна написати без явної перевірки, якщо obj має значення NULL:

static int
add_spam(PyObject *module, int value)
{
    PyObject *obj = PyLong_FromLong(value);
    if (PyModule_AddObject(module, "spam", obj) < 0) {
        Py_XDECREF(obj);
        return -1;
    }
    // PyModule_AddObject() stole a reference to obj:
    // Py_DECREF(obj) is not needed here
    return 0;
}

Зверніть увагу, що в цьому випадку слід використовувати Py_XDECREF() замість Py_DECREF(), оскільки obj може бути NULL.

int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
Part of the Stable ABI.

Додайте цілу константу до module як name. Цю зручну функцію можна використовувати з функції ініціалізації модуля. Повертає -1 у разі помилки, 0 у разі успіху.

int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)
Part of the Stable ABI.

Додайте рядкову константу до module як name. Цю зручну функцію можна використовувати з функції ініціалізації модуля. Рядок значення має завершуватися NULL. Повертає -1 у разі помилки, 0 у разі успіху.

PyModule_AddIntMacro(module, macro)

Додайте константу int до module. Ім’я та значення взято з макросу. Наприклад, PyModule_AddIntMacro(module, AF_INET) додає константу int AF_INET зі значенням AF_INET до module. Повертає -1 у разі помилки, 0 у разі успіху.

PyModule_AddStringMacro(module, macro)

Додайте рядкову константу до module.

int PyModule_AddType(PyObject *module, PyTypeObject *type)
Part of the Stable ABI since version 3.10.

Додайте об’єкт типу до module. Об’єкт типу завершується внутрішнім викликом PyType_Ready(). Ім’я об’єкта типу береться з останнього компонента tp_name після крапки. Повертає -1 у разі помилки, 0 у разі успіху.

Added in version 3.9.

Пошук модуля

Однофазова ініціалізація створює однотонні модулі, які можна шукати в контексті поточного інтерпретатора. Це дозволяє пізніше отримати об’єкт модуля лише з посиланням на визначення модуля.

Ці функції не працюватимуть на модулях, створених за допомогою багатофазної ініціалізації, оскільки кілька таких модулів можна створити з одного визначення.

PyObject *PyState_FindModule(PyModuleDef *def)
Return value: Borrowed reference. Part of the Stable ABI.

Повертає об’єкт модуля, який було створено з def для поточного інтерпретатора. Цей метод вимагає, щоб об’єкт модуля був прикріплений до стану інтерпретатора за допомогою PyState_AddModule() заздалегідь. Якщо відповідний об’єкт модуля не знайдено або ще не приєднано до стану інтерпретатора, він повертає NULL.

int PyState_AddModule(PyObject *module, PyModuleDef *def)
Part of the Stable ABI since version 3.3.

Приєднує об’єкт модуля, переданий у функцію, до стану інтерпретатора. Це дозволяє об’єкту модуля бути доступним через PyState_FindModule().

Діє лише для модулів, створених за допомогою однофазної ініціалізації.

Python автоматично викликає PyState_AddModule після імпортування модуля, тому непотрібно (але нешкідливо) викликати його з коду ініціалізації модуля. Явний виклик потрібен, лише якщо власний код ініціалізації модуля згодом викликає PyState_FindModule. Ця функція в основному призначена для впровадження альтернативних механізмів імпорту (або через її прямий виклик, або шляхом посилання на її реалізацію для отримання деталей необхідних оновлень стану).

Абонент повинен тримати GIL.

Повертає 0 у разі успіху або -1 у разі невдачі.

Added in version 3.3.

int PyState_RemoveModule(PyModuleDef *def)
Part of the Stable ABI since version 3.3.

Видаляє об’єкт модуля, створений з def, зі стану інтерпретатора. Повертає 0 у разі успіху або -1 у разі невдачі.

Абонент повинен тримати GIL.

Added in version 3.3.