Об’єкти модуля¶
-
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__
.Нове в версії 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_*
andPyObject_*
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
.Нове в версії 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.Нове в версії 3.2.
-
const char *PyModule_GetFilename(PyObject *module)¶
- Part of the Stable ABI.
Подібно до
PyModule_GetFilenameObject()
, але повертає назву файлу, закодовану як „utf-8“.Застаріло починаючи з версії 3.2:
PyModule_GetFilename()
raisesUnicodeEncodeError
on unencodable filenames, usePyModule_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
.
-
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 ifm_size
is greater than 0 and the module state (as returned byPyModule_GetState()
) isNULL
.Змінено в версії 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 ifm_size
is greater than 0 and the module state (as returned byPyModule_GetState()
) isNULL
.Як і
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 ifm_size
is greater than 0 and the module state (as returned byPyModule_GetState()
) isNULL
.Змінено в версії 3.9: Більше не викликається до виділення стану модуля.
-
PyModuleDef_Base m_base¶
Однофазна ініціалізація¶
Функція ініціалізації модуля може створювати та повертати об’єкт модуля безпосередньо. Це називається «однофазною ініціалізацією» та використовує одну з наступних двох функцій створення модуля:
-
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 toPYTHON_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.
-
int slot¶
Масив 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
.-
PyObject *create_module(PyObject *spec, PyModuleDef *def)
-
Py_mod_exec¶
Визначає функцію, яка викликається для виконання модуля. Це еквівалентно виконанню коду модуля Python: зазвичай ця функція додає класи та константи до модуля. Сигнатура функції:
-
int exec_module(PyObject *module)
Якщо вказано кілька слотів
Py_mod_exec
, вони обробляються в тому порядку, в якому вони з’являються в масиві m_slots.-
int exec_module(PyObject *module)
Перегляньте 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 toPYTHON_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 isNULL
. 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 thePyModule_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 oftp_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.