Egy modul implementálása¶
Ez a fejezet részletezi, hogyan implementálj egy alapmodult a MicroPythonban. A MicroPython modulok a következők egyike lehetnek:
Beépített modul: Egy általános modul, amely a MicroPython tároló része.
Felhasználói modul: Egy modul, amely az adott projektedhez hasznos, és amelyet a saját tárolódban vagy privát kódbázisodban tartasz karban.
Dinamikus modul: Egy modul, amely futásidőben telepíthető és importálható az eszközödre.
Egy MicroPython modul a következő helyek egyikén implementálható:
py/: Egy alapkönyvtár, amely a CPython alapfunkcióit tükrözi.
extmod/: Egy CPython- vagy MicroPython-specifikus modul, amely több porton osztozik.
ports/<port>/: Egy portspecifikus modul.
Megjegyzés
Ez a fejezet a py/ könyvtárban implementált modulokat, azaz az alapmodulokat ismerteti. Egy külső modul implementálásának részleteiért lásd: A MicroPython kiterjesztése C-ben. A portspecifikus modulok részleteiért lásd: A MicroPython portolása.
Egy alapmodul implementálása¶
A CPythonhoz hasonlóan a MicroPython is rendelkezik beépített alapmodulokkal, amelyek import utasításokon keresztül érhetők el. Ilyen például a gc modul, amelyet a Memóriakezelés tárgyal.
>>> import gc
>>> gc.enable()
>>>
A MicroPython számos további beépített standard/alapmodullal rendelkezik, mint például az io, az array stb. Egy új alapmodul hozzáadása több módosítást is igényel.
Először hozd létre a C fájlt a py/ könyvtárban. Ebben a példában egy hipotetikus új subsystem modult adunk hozzá a modsubsystem.c fájlban:
#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
Az implementáció tartalmazza a modulhoz kapcsolódó összes függvény definícióját, és hozzáadja a függvényeket a modul globális táblájához az mp_module_subsystem_globals_table-ben. Emellett létrehozza a modulobjektumot az mp_module_subsystem segítségével. A modul ezután regisztrálásra kerül a tágabb rendszerben az MP_REGISTER_MODULE makrón keresztül.
A módosított MicroPython leépítése és futtatása után a modulnak importálhatónak kell lennie:
>>> import subsystem
>>> subsystem.info()
42
>>>
Az info() függvényünk jelenleg csak egyetlen számot ad vissza, de kibővíthető bármire. Hasonlóképpen további függvények is hozzáadhatók ehhez az új modulhoz.