Объекты модулей
-
PyTypeObject PyModule_Type -
Часть Стабильной 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) -
Значение возврата: Новый ссылка. Часть Стабильной ABI с версии 3.7.
Возвращает новый объект модуля с
module.__name__, установленным в name. Атрибуты модуля__name__,__doc__,__package__и__loader__заполняются (все, кроме__name__, устанавливаются вNone). Вызывающий код отвечает за установку атрибута__file__.Возвращает
NULLс установленной исключительной ситуацией при ошибке.Добавлена в версии 3.3.
Изменено в версии 3.4:
__package__и__loader__теперь устанавливаются вNone.
-
PyObject *PyModule_New(const char *name) -
Значение возврата: Новый ссылка. Часть Стабильной ABI.
Аналогично
PyModule_NewObject(), но имя является строкой UTF-8, а не объектом Unicode.
-
PyObject *PyModule_GetDict(PyObject *module) -
Значение возврата: Одолженная ссылка. Часть Стабильной ABI.
Возвращает объект словаря, реализующий пространство имен module; этот объект совпадает с атрибутом
__dict__объекта модуля. Если module не является объектом модуля (или подтипом объекта модуля), поднимаетсяSystemErrorи возвращаетсяNULL.Рекомендуется, чтобы расширения использовали другие
PyModule_*иPyObject_*функции, а не напрямую манипулировали атрибутом__dict__модуля.
-
PyObject *PyModule_GetNameObject(PyObject *module) -
Значение возврата: Новый ссылка. Часть Стабильной ABI с версии 3.7.
Возвращает значение
__name__модуля. Если модуль не предоставляет его, или если это не строка, поднимаетсяSystemErrorи возвращаетсяNULL.Добавлена в версии 3.3.
-
const char *PyModule_GetName(PyObject *module) -
Часть Стабильной ABI.
Аналогично
PyModule_GetNameObject(), но возвращает закодированное имя в'utf-8'.
-
void *PyModule_GetState(PyObject *module) -
Часть Стабильной ABI.
Возвращает «состояние» модуля, т.е. указатель на блок памяти, выделенный во время создания модуля, или
NULL. См.PyModuleDef.m_size.
-
PyModuleDef *PyModule_GetDef(PyObject *module) -
Часть Стабильной ABI.
Возвращает указатель на структуру
PyModuleDef, из которой был создан модуль, илиNULLесли модуль не был создан из определения.
-
PyObject *PyModule_GetFilenameObject(PyObject *module) -
Значение возврата: Новый ссылка. Часть Стабильной ABI.
Возвращает имя файла, из которого был загружен module, используя атрибут
__file__module. Если он не определен или не является строкой, поднимаетсяSystemErrorи возвращаетсяNULL; в противном случае возвращается ссылка на объект Unicode.Добавлена в версии 3.2.
-
const char *PyModule_GetFilename(PyObject *module) -
Часть Стабильной ABI.
Аналогично
PyModule_GetFilenameObject(), но возвращает имя файла, закодированное в ‘utf-8’.Устарело начиная с версии 3.2:
PyModule_GetFilename()поднимаетUnicodeEncodeErrorдля некодируемых имён файлов, используйтеPyModule_GetFilenameObject()вместо этого.
Инициализация модулей C
Объекты модулей обычно создаются из модулей расширения (динамических библиотек, которые экспортируют функцию инициализации) или встроенных модулей (где функция инициализации добавляется с помощью PyImport_AppendInittab()). Подробности см. в разделах Создание расширений на C и C++ или Расширение встраиваемого Python.
Функция инициализации может передать экземпляр определения модуля в PyModule_Create() и вернуть полученный объект модуля или запросить «многофазную инициализацию», вернув саму структуру определения.
-
type PyModuleDef -
Часть Стабильной ABI (включая все члены).
Структура определения модуля, которая содержит всю информацию, необходимую для создания объекта модуля. Обычно для каждого модуля существует только одна статически инициализированная переменная этого типа.
-
PyModuleDef_Base m_base -
Всегда инициализируйте этот член в
PyModuleDef_HEAD_INIT.
-
const char *m_name -
Имя нового модуля.
-
const char *m_doc -
Документация модуля; обычно используется переменная документации, созданная с помощью
PyDoc_STRVAR.
-
Py_ssize_t m_size -
Состояние модуля может храниться в области памяти, специфичной для модуля, которую можно получить с помощью
PyModule_GetState(), а не в статических глобальных переменных. Это делает модули безопасными для использования в нескольких подинтерпретаторах.Эта область памяти выделяется на основе m_size при создании модуля и освобождается при удалении объекта модуля после вызова функции
m_free, если она присутствует.Установка
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 -
Функция обхода для вызова во время обхода сборки мусора объекта модуля или
NULL, если не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до выполнения модуля (функция
Py_mod_exec). Точнее, эта функция не вызывается, еслиm_sizeбольше нуля и состояние модуля (как возвращаетсяPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
inquiry m_clear -
Функция очистки для вызова во время очистки объекта модуля сборщиком мусора или
NULL, если не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до выполнения модуля (функция
Py_mod_exec). Точнее, эта функция не вызывается, еслиm_sizeбольше нуля и состояние модуля (как возвращаетсяPyModule_GetState()) равноNULL.Как и
PyTypeObject.tp_clear, эта функция не всегда вызывается перед удалением модуля. Например, когда подсчет ссылок достаточно, чтобы определить, что объект больше не используется, циклический сборщик мусора не участвует иm_freeвызывается непосредственно.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
freefunc m_free -
Функция для вызова при удалении объекта модуля, или
NULL, если не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до выполнения модуля (функция
Py_mod_exec). Точнее, эта функция не вызывается, еслиm_sizeбольше нуля и состояние модуля (как возвращаетсяPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
Однофазная инициализация
Функция инициализации модуля может создать и вернуть объект модуля непосредственно. Это называется «однофазной инициализацией» и использует одну из следующих двух функций создания модулей:
-
PyObject *PyModule_Create(PyModuleDef *def) -
Значение возврата: Новая ссылка.
Создает новый объект модуля, используя определение в def. Это работает так же, как
PyModule_Create2()с module_api_version, установленным вPYTHON_API_VERSION.
-
PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version) -
Значение возврата: Новая ссылка. Часть Стабильной ABI.
Создает новый объект модуля, используя определение в def, предполагая версию API module_api_version. Если эта версия не соответствует версии работающего интерпретатора, выводится предупреждение
RuntimeWarning.Возвращает
NULLс установленным исключением при ошибке.Примечание
Большинство случаев использования этой функции должны использовать
PyModule_Create()вместо неё; используйте эту функцию только если вы уверены, что вам это нужно.
Перед возвратом из функции инициализации, полученный объект модуля обычно заполняется с помощью функций, таких как PyModule_AddObjectRef().
Многофазная инициализация
Альтернативный способ определения расширений — запрос «многофазной инициализации». Модули расширений, созданные таким образом, ведут себя больше как модули Python: инициализация разделена между фазой создания, когда создается объект модуля, и фазой выполнения, когда он заполняется. Различие аналогично методам __new__() и __init__() классов.
В отличие от модулей, созданных с использованием однофазной инициализации, эти модули не являются синглтонами: если запись в sys.modules удаляется, а модуль повторно импортируется, создается новый объект модуля, а старый модуль подвергается стандартному сборке мусора — как и в случае с модулями Python. По умолчанию несколько модулей, созданных из одного определения, должны быть независимыми: изменения в одном не должны влиять на другие. Это означает, что все состояние должно быть специфичным для объекта модуля (например, с использованием PyModule_GetState()) или его содержимого (например, __dict__ модуля или отдельных классов, созданных с помощью PyType_FromSpec()).
Ожидается, что все модули, созданные с использованием многофазной инициализации, будут поддерживать подчиненные интерпретаторы. Обеспечение независимости нескольких модулей обычно достаточно для этого.
Для запроса многофазной инициализации функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef с непустым m_slots. Перед возвратом экземпляр PyModuleDef должен быть инициализирован с помощью следующей функции:
-
PyObject *PyModuleDef_Init(PyModuleDef *def) -
Значение возврата: Удерживаемая ссылка. Часть Стабильной ABI с версии 3.5.
Обеспечивает, что определение модуля является должным образом инициализированным объектом Python, который правильно сообщает свой тип и счетчик ссылок.
Возвращает def, отформатированный как
PyObject*, илиNULLв случае ошибки.Добавлен в версии 3.5.
Член m_slots определения модуля должен указывать на массив структур PyModuleDef_Slot:
-
type PyModuleDef_Slot -
-
int slot -
Идентификатор слота, выбранный из доступных значений, объясненных ниже.
-
void *value -
Значение слота, смысл которого зависит от идентификатора слота.
Добавлен в версии 3.5.
-
Массив m_slots должен завершаться слотом с id 0.
Доступные типы слотов:
-
Py_mod_create -
Определяет функцию, которая вызывается для создания самого объекта модуля. Указатель value этого слота должен указывать на функцию с сигнатурой:
-
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есть не-NULLm_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 -
Определяет одно из следующих значений:
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED -
Модуль не поддерживает импорт в подчиненных интерпретаторах.
-
Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED -
Модуль поддерживает импорт в подчиненных интерпретаторах, но только когда они используют блокировку GIL основного интерпретатора. (См. Изоляция модулей расширений.)
-
Py_MOD_PER_INTERPRETER_GIL_SUPPORTED -
Модуль поддерживает импорт в подчиненных интерпретаторах, даже если у них есть собственный GIL. (См. Изоляция модулей расширений.)
Этот слот определяет, будет ли провален импорт этого модуля в подчиненном интерпретаторе.
Несколько слотов
Py_mod_multiple_interpretersне могут быть указаны в одном определении модуля.Если
Py_mod_multiple_interpretersне указан, механизм импорта по умолчанию используетPy_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED.Добавлен в версии 3.12.
-
-
Py_mod_gil -
Определяет одно из следующих значений:
-
Py_MOD_GIL_USED -
Модуль зависит от наличия глобальной блокировки интерпретатора (GIL) и может обращаться к глобальному состоянию без синхронизации.
-
Py_MOD_GIL_NOT_USED -
Модуль может безопасно выполняться без активного GIL.
Этот слот игнорируется в сборках Python, не настроенных с помощью
--disable-gil. В противном случае он определяет, будет ли при импорте этого модуля автоматически включен GIL. См. Беспрепятственно-потоковый CPython для получения более подробной информации.Несколько слотов
Py_mod_gilне могут быть указаны в одном определении модуля.Если
Py_mod_gilне указан, механизм импорта по умолчанию используетPy_MOD_GIL_USED.Добавлен в версии 3.13.
-
См. PEP 489 для получения более подробной информации о многофазной инициализации.
Функции низкоуровневого создания модулей
Следующие функции вызываются в фоновом режиме при использовании многофазной инициализации. Их можно использовать напрямую, например, при динамическом создании объектов модулей. Обратите внимание, что для полной инициализации модуля необходимо вызвать как PyModule_FromDefAndSpec, так и PyModule_ExecDef.
-
PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec) -
Значение возврата: Новый указатель.
Создает новый объект модуля, используя определение в def и ModuleSpec spec. Это работает так же, как
PyModule_FromDefAndSpec2()с module_api_version, установленным вPYTHON_API_VERSION.Добавлена в версии 3.5.
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version) -
Значение возврата: Новый указатель. Часть Стабильной ABI начиная с версии 3.7.
Создает новый объект модуля, используя определение в def и ModuleSpec spec, предполагая версию API module_api_version. Если эта версия не совпадает с версией интерпретатора, выполняющегося в данный момент, выводится
RuntimeWarning.Возвращает
NULL, если произошла ошибка.Примечание
В большинстве случаев использование этой функции следует заменять на
PyModule_FromDefAndSpec(); используйте эту функцию только в том случае, если вы уверены в необходимости этого.Добавлена в версии 3.5.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def) -
Часть Стабильной ABI начиная с версии 3.7.
Обрабатывает все слоты выполнения (
Py_mod_exec), заданные в def.Добавлена в версии 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring) -
Часть Стабильной ABI начиная с версии 3.7.
Устанавливает строку документации для module в docstring. Эта функция вызывается автоматически при создании модуля из
PyModuleDef, используя либоPyModule_Create, либоPyModule_FromDefAndSpec.Добавлена в версии 3.5.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions) -
Часть Стабильной ABI начиная с версии 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) -
Часть Стабильного API с версии 3.10.
Добавляет объект в модуль под именем name. Это вспомогательная функция, которую можно использовать из функции инициализации модуля.
При успешном выполнении возвращает
0. При ошибке генерирует исключение и возвращает-1.Возвращает
-1, если value является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.Количество различных строк name, передаваемых в эту функцию, следует сохранять небольшим, обычно используя только статически выделенные строки в качестве name. Для имён, которые неизвестны на этапе компиляции, предпочтительнее вызывать
PyUnicode_FromString()иPyObject_SetAttr()напрямую. Более подробную информацию см. вPyUnicode_InternFromString(), которая может использоваться внутри для создания объекта ключа.Добавлена в версии 3.10.
-
int PyModule_Add(PyObject *module, const char *name, PyObject *value) -
Часть Стабильного API с версии 3.13.
Аналогично
PyModule_AddObjectRef(), но «захватывает» ссылку на value. Её можно вызывать с результатом функции, возвращающей новую ссылку, не беспокоясь о проверке результата или даже сохранении его в переменной.Пример использования:
if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) { goto error; }Добавлена в версии 3.13.
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) -
Часть Стабильного API.
Аналогично
PyModule_AddObjectRef(), но при успехе захватывает ссылку на value (если возвращает0).Рекомендуется использовать новые функции
PyModule_Add()илиPyModule_AddObjectRef(), так как легко допустить утечку памяти, неправильно используя функциюPyModule_AddObject().Примечание
В отличие от других функций, которые захватывают ссылки,
PyModule_AddObject()освобождает ссылку на value только при успехе.Это означает, что необходимо проверять возвращаемое значение, и код вызывающий должен вручную вызвать
Py_XDECREF()value при ошибке.Пример использования:
PyObject *obj = PyBytes_FromString(value); if (PyModule_AddObject(module, "spam", obj) < 0) { // If 'obj' is not NULL and PyModule_AddObject() failed, // 'obj' strong reference must be deleted with Py_XDECREF(). // If 'obj' is NULL, Py_XDECREF() does nothing. Py_XDECREF(obj); goto error; } // PyModule_AddObject() stole a reference to obj: // Py_XDECREF(obj) is not needed here.Устарела начиная с версии 3.13:
PyModule_AddObject()является мягко устаревшей.
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value) -
Часть Стабильного API.
Добавляет целочисленную константу в модуль как name. Эта вспомогательная функция может использоваться из функции инициализации модуля. Возвращает
-1с установленным исключением при ошибке,0при успехе.Это вспомогательная функция, вызывающая
PyLong_FromLong()иPyModule_AddObjectRef(); см. их документацию для получения подробностей.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) -
Часть Стабильного API.
Добавляет строковую константу в модуль как name. Эта вспомогательная функция может использоваться из функции инициализации модуля. Строка value должна быть нуль-терминированной. Возвращает
-1с установленным исключением при ошибке,0при успехе.Это вспомогательная функция, вызывающая
PyUnicode_InternFromString()иPyModule_AddObjectRef(); см. их документацию для получения подробностей.
-
PyModule_AddIntMacro(module, macro) -
Добавляет целочисленную константу в модуль. Имя и значение берутся из macro. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет целочисленную константу AF_INET со значением AF_INET в модуль. Возвращает-1с установленным исключением при ошибке,0при успехе.
-
PyModule_AddStringMacro(module, macro) -
Добавляет строковую константу в модуль.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type) -
Часть Стабильного API с версии 3.10.
Добавляет объект типа в модуль. Объект типа завершается вызовом
PyType_Ready()внутри. Имя объекта типа берется из последнего компонентаtp_nameпосле точки. Возвращает-1с установленным исключением при ошибке,0при успехе.Добавлена в версии 3.9.
-
int PyUnstable_Module_SetGIL(PyObject *module, void *gil) -
Это Нестабильный API. Может быть изменён без предупреждения в малых релизах.
Указывает, поддерживает ли модуль запуск без блокировки глобального интерпретатора (GIL), используя одно из значений из
Py_mod_gil. Должен быть вызван во время функции инициализации модуля. Если эта функция не вызывается во время инициализации модуля, механизм импорта предполагает, что модуль не поддерживает запуск без GIL. Эта функция доступна только в сборках Python, сконфигурированных с--disable-gil. Возвращает-1с установленным исключением при ошибке,0при успехе.Добавлена в версии 3.13.
Поиск модуля
Инициализация однофазного типа создает модули-синглтоны, которые можно искать в контексте текущего интерпретатора. Это позволяет позже извлечь объект модуля, используя только ссылку на определение модуля.
Эти функции не будут работать с модулями, созданными с использованием многофазной инициализации, так как из одного определения можно создать несколько таких модулей.
-
PyObject *PyState_FindModule(PyModuleDef *def) -
Значение возврата: Заимствованная ссылка. Часть Стабильного API.
Возвращает объект модуля, созданный из def для текущего интерпретатора. Этот метод требует, чтобы объект модуля был присоединён к состоянию интерпретатора с помощью
PyState_AddModule()предварительно. В случае, если соответствующий объект модуля не найден или ещё не присоединён к состоянию интерпретатора, он возвращаетNULL.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def) -
Часть Стабильного API с версии 3.3.
Присоединяет переданный функции объект модуля к состоянию интерпретатора. Это позволяет получить доступ к объекту модуля через
PyState_FindModule().Эффективна только для модулей, созданных с использованием однофазной инициализации.
Python вызывает
PyState_AddModuleавтоматически после импорта модуля, поэтому вызывать его из кода инициализации модуля не нужно (но это не навредит). Явное обращение требуется только в том случае, если собственный код инициализации модуля впоследствии вызываетPyState_FindModule. Функция предназначена в основном для реализации альтернативных механизмов импорта (либо вызывая её напрямую, либо обращаясь к её реализации для получения подробностей о необходимых обновлениях состояния).Вызывающий код должен удерживать GIL.
Возвращает
-1с установленным исключением в случае ошибки,0при успешном выполнении.Добавлена в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def) -
Часть Стабильного API с версии 3.3.
Удаляет объект модуля, созданный из def, из состояния интерпретатора. Возвращает
-1с установленным исключением в случае ошибки,0при успешном выполнении.Вызывающий код должен удерживать GIL.
Добавлена в версии 3.3.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/module.html