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.