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

PyTypeObject PyModule_Type

Цей екземпляр PyTypeObject представляє тип модуля Python. Це доступно для програм Python як types.ModuleType.

int PyModule_Check(PyObject *p)

Return true if p is a module object, or a subtype of a module object.

int PyModule_CheckExact(PyObject *p)

Return true if p is a module object, but not a subtype of PyModule_Type.

PyObject* PyModule_NewObject(PyObject *name)
Return value: New reference.

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

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

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

PyObject* PyModule_New(const char *name)
Return value: New reference.

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

PyObject* PyModule_GetDict(PyObject *module)
Return value: Borrowed reference.

Повертає об’єкт словника, який реалізує простір імен 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.

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

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

const char* PyModule_GetName(PyObject *module)

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

void* PyModule_GetState(PyObject *module)

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

PyModuleDef* PyModule_GetDef(PyObject *module)

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

PyObject* PyModule_GetFilenameObject(PyObject *module)
Return value: New reference.

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

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

const char* PyModule_GetFilename(PyObject *module)

Подібно до 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() і повернути результуючий об’єкт модуля, або запросити «багатофазову ініціалізацію», повернувши саму структуру визначення.

PyModuleDef

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

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

A traversal function to call during GC traversal of the module object, or NULL if not needed. This function may be called before module state is allocated (PyModule_GetState() may return NULL), and before the Py_mod_exec function is executed.

inquiry m_clear

A clear function to call during GC clearing of the module object, or NULL if not needed. This function may be called before module state is allocated (PyModule_GetState() may return NULL), and before the Py_mod_exec function is executed.

freefunc m_free

A function to call during deallocation of the module object, or NULL if not needed. This function may be called before module state is allocated (PyModule_GetState() may return NULL), and before the Py_mod_exec function is executed.

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

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

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.

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

Примітка

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

Before it is returned from in the initialization function, the resulting module object is typically populated using functions like PyModule_AddObject().

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

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.

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

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

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

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

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

Create a new module object, given the definition in module 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)

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

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

int PyModule_SetDocString(PyObject *module, const char *docstring)

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

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

int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)

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

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

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

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

int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)

Add an object to module as name. This is a convenience function which can be used from the module’s initialization function. This steals a reference to value on success. Return -1 on error, 0 on success.

Примітка

Unlike other functions that steal references, PyModule_AddObject() only decrements the reference count of value on success.

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

Py_INCREF(spam);
if (PyModule_AddObject(module, "spam", spam) < 0) {
    Py_DECREF(module);
    Py_DECREF(spam);
    return NULL;
}
int PyModule_AddIntConstant(PyObject *module, const char *name, long value)

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)

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.

int PyModule_AddIntMacro(PyObject *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.

int PyModule_AddStringMacro(PyObject *module, macro)

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

Пошук модуля

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

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

PyObject* PyState_FindModule(PyModuleDef *def)
Return value: Borrowed reference.

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

int PyState_AddModule(PyObject *module, PyModuleDef *def)

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

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

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

Return 0 on success or -1 on failure.

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

int PyState_RemoveModule(PyModuleDef *def)

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

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