Implementace modulu

Tato kapitola podrobně popisuje, jak implementovat základní modul v MicroPythonu. Moduly MicroPythonu mohou být jedním z následujících:

  • Vestavěný modul: Obecný modul, který je součástí repozitáře MicroPython.

  • Uživatelský modul: Modul, který je užitečný pro váš konkrétní projekt a který udržujete ve vlastním repozitáři nebo soukromé kódové základně.

  • Dynamický modul: Modul, který lze nasadit a importovat za běhu na vaše zařízení.

Modul v MicroPythonu lze implementovat na jednom z následujících míst:

  • py/: Základní knihovna, která zrcadlí základní funkcionalitu CPythonu.

  • extmod/: Modul specifický pro CPython nebo MicroPython, který je sdílen napříč více porty.

  • ports/<port>/: Modul specifický pro daný port.

Poznámka

Tato kapitola popisuje moduly implementované v py/ neboli základní moduly. Podrobnosti o implementaci externího modulu najdete v Rozšiřování MicroPythonu v jazyce C. Podrobnosti o modulech specifických pro daný port najdete v Portování MicroPythonu.

Implementace základního modulu

Stejně jako CPython má i MicroPython základní vestavěné moduly, ke kterým lze přistupovat prostřednictvím příkazů import. Příkladem je modul gc, který je probírán v Správa paměti.

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

MicroPython má několik dalších vestavěných standardních/základních modulů jako io, array atd. Přidání nového základního modulu zahrnuje několik úprav.

Nejprve vytvořte soubor C v adresáři py/. V tomto příkladu přidáváme hypotetický nový modul subsystem v souboru 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

Implementace zahrnuje definici všech funkcí souvisejících s modulem a přidává funkce do globální tabulky modulu v mp_module_subsystem_globals_table. Také vytváří objekt modulu pomocí mp_module_subsystem. Modul je poté zaregistrován do širšího systému prostřednictvím makra MP_REGISTER_MODULE.

Po sestavení a spuštění upraveného MicroPythonu by nyní měl být modul importovatelný:

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

Naše funkce info() aktuálně vrací pouze jediné číslo, ale lze ji rozšířit, aby dělala cokoli. Podobně lze do tohoto nového modulu přidat další funkce.