Реализация модуля

В этой главе подробно описывается, как реализовать основной модуль в MicroPython. Модули MicroPython могут быть одного из следующих типов:

  • Встроенный модуль: общий модуль, являющийся частью репозитория MicroPython.

  • Пользовательский модуль: модуль, полезный для вашего конкретного проекта, который вы поддерживаете в собственном репозитории или приватной кодовой базе.

  • Динамический модуль: модуль, который можно развернуть и импортировать на вашем устройстве во время выполнения.

Модуль в MicroPython может быть реализован в одном из следующих мест:

  • py/: основная библиотека, отражающая основную функциональность CPython.

  • extmod/: модуль, специфичный для CPython или MicroPython, который используется совместно несколькими портами.

  • ports/<port>/: модуль, специфичный для порта.

Примечание

В этой главе описываются модули, реализованные в py/, или основные модули. Подробнее о реализации внешнего модуля см. Расширение MicroPython на C. Подробнее о модулях, специфичных для порта, см. Портирование MicroPython.

Реализация основного модуля

Как и CPython, MicroPython имеет основные встроенные модули, доступ к которым осуществляется через операторы import. Примером является модуль gc, рассмотренный в Управление памятью.

>>> import gc
>>> gc.enable()
>>>

В MicroPython есть несколько других встроенных стандартных/основных модулей, таких как io, array и т. д. Добавление нового основного модуля включает несколько изменений.

Сначала создайте файл C в каталоге py/. В этом примере мы добавляем гипотетический новый модуль subsystem в файл modsubsystem.c:

#include "py/builtin.h"
#include "py/runtime.h"

#if MICROPY_PY_SUBSYSTEM

// info()
static mp_obj_t py_subsystem_info(void) {
    return MP_OBJ_NEW_SMALL_INT(42);
}
MP_DEFINE_CONST_FUN_OBJ_0(subsystem_info_obj, py_subsystem_info);

static const mp_rom_map_elem_t mp_module_subsystem_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_subsystem) },
    { MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&subsystem_info_obj) },
};
static MP_DEFINE_CONST_DICT(mp_module_subsystem_globals, mp_module_subsystem_globals_table);

const mp_obj_module_t mp_module_subsystem = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t *)&mp_module_subsystem_globals,
};

MP_REGISTER_MODULE(MP_QSTR_subsystem, mp_module_subsystem);

#endif

Реализация включает определение всех функций, связанных с модулем, и добавляет эти функции в глобальную таблицу модуля в mp_module_subsystem_globals_table. Она также создаёт объект модуля с помощью mp_module_subsystem. Затем модуль регистрируется в системе в целом через макрос MP_REGISTER_MODULE.

После сборки и запуска изменённого MicroPython модуль теперь должен быть доступен для импорта:

>>> import subsystem
>>> subsystem.info()
42
>>>

Наша функция info() в настоящее время возвращает всего лишь одно число, но может быть расширена для выполнения чего угодно. Аналогично, в этот новый модуль можно добавить больше функций.