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

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.

  Return a new module object with the `__name__` attribute set to name. The module’s `__name__`, `__doc__`, `__package__`, and `__loader__` attributes are filled in (all but `__name__` are set to `None`); the caller is responsible for providing a `__file__` attribute.

  Нове в версії 3.3.

  Змінено в версії 3.4: `__package__` and `__loader__` are set to `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.

  Return module’s `__name__` value. If the module does not provide one, or if it is not a string, `SystemError` is raised and `NULL` is returned.

  Нове в версії 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.

  Return the name of the file from which module was loaded using module’s `__file__` attribute. If this is not defined, or if it is not a unicode string, raise `SystemError` and return `NULL`; otherwise return a reference to a Unicode object.

  Нове в версії 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`, якщо сталася помилка.

  Нове в версії 3.5.

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

type PyModuleDef_Slot
  int slot

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

  void *value

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

  Нове в версії 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.

Перегляньте 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`.

  Нове в версії 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()`; використовуйте це, лише якщо ви впевнені, що це вам потрібно.

  Нове в версії 3.5.

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

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

  Нове в версії 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`.

  Нове в версії 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`.

  Нове в версії 3.5.

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

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

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

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

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

  Return `NULL` if value is `NULL`. It must be called with an exception raised in this case.

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

      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`.

  Нове в версії 3.10.

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

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

  The new `PyModule_AddObjectRef()` function is recommended, since it is easy to introduce reference leaks by misusing the `PyModule_AddObject()` function.

  Примітка

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

  This means that its return value must be checked, and calling code must `Py_DECREF()` value manually on error.

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

      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.

  Add an integer constant to module as name. This convenience function can be used from the module’s initialization function. Return `-1` on error, `0` on success.

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

  Add a string constant to module as name. This convenience function can be used from the module’s initialization function. The string value must be `NULL`-terminated. Return `-1` on error, `0` on success.

PyModule_AddIntMacro(module, macro)

  Add an int constant to module. The name and the value are taken from macro. For example `PyModule_AddIntMacro(module, AF_INET)` adds the int constant AF_INET with the value of AF_INET to module. Return `-1` on error, `0` on success.

PyModule_AddStringMacro(module, macro)

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

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

  Add a type object to module. The type object is finalized by calling internally `PyType_Ready()`. The name of the type object is taken from the last component of `tp_name` after dot. Return `-1` on error, `0` on success.

  Нове в версії 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.

  Return 0 on success or -1 on failure.

  Нове в версії 3.3.

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

  Removes the module object created from def from the interpreter state. Return 0 on success or -1 on failure.

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

  Нове в версії 3.3.