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.