Об’єкти модуля¶
-
PyTypeObject
PyModule_Type
¶ Цей екземпляр
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.
Повертає новий об’єкт модуля з атрибутом
__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_*()
andPyObject_*()
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()
raisesUnicodeEncodeError
on unencodable filenames, usePyModule_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
.
-
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
Однофазна ініціалізація¶
Функція ініціалізації модуля може створювати та повертати об’єкт модуля безпосередньо. Це називається «однофазною ініціалізацією» та використовує одну з наступних двох функцій створення модуля:
-
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.
Створіть новий об’єкт модуля, враховуючи визначення в 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.
-
int
Масив 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*
-
Py_mod_exec
¶ Визначає функцію, яка викликається для виконання модуля. Це еквівалентно виконанню коду модуля Python: зазвичай ця функція додає класи та константи до модуля. Сигнатура функції:
Якщо вказано кілька слотів
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 toPYTHON_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_AddType
(PyObject *module, PyTypeObject *type)¶ 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.
Повертає об’єкт модуля, який було створено з def для поточного інтерпретатора. Цей метод вимагає, щоб об’єкт модуля був прикріплений до стану інтерпретатора за допомогою
PyState_AddModule()
заздалегідь. Якщо відповідний об’єкт модуля не знайдено або ще не приєднано до стану інтерпретатора, він повертаєNULL
.
-
int
PyState_AddModule
(PyObject *module, PyModuleDef *def)¶ Приєднує об’єкт модуля, переданий у функцію, до стану інтерпретатора. Це дозволяє об’єкту модуля бути доступним через
PyState_FindModule()
.Діє лише для модулів, створених за допомогою однофазної ініціалізації.
Python автоматично викликає
PyState_AddModule
після імпортування модуля, тому непотрібно (але нешкідливо) викликати його з коду ініціалізації модуля. Явний виклик потрібен, лише якщо власний код ініціалізації модуля згодом викликаєPyState_FindModule
. Ця функція в основному призначена для впровадження альтернативних механізмів імпорту (або через її прямий виклик, або шляхом посилання на її реалізацію для отримання деталей необхідних оновлень стану).Абонент повинен тримати GIL.
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.
Абонент повинен тримати GIL.
Нове в версії 3.3.