Implementarea unui modul#

Acest capitol detaliază cum se implementează un modul de bază în MicroPython. Modulele MicroPython pot fi de unul dintre următoarele tipuri:

  • Modul încorporat: Un modul general care face parte din depozitul MicroPython.

  • Modul de utilizator: Un modul util pentru proiectul dumneavoastră specific, pe care îl mențineți în propriul depozit sau în baza de cod privată.

  • Modul dinamic: Un modul care poate fi implementat și importat la momentul execuției pe dispozitivul dumneavoastră.

Un modul în MicroPython poate fi implementat în una dintre următoarele locații:

  • py/: O bibliotecă de bază care reflectă funcționalitatea de bază a CPython.

  • extmod/: Un modul specific CPython sau MicroPython care este partajat între mai multe porturi.

  • ports/<port>/: Un modul specific unui port.

Notă

Acest capitol descrie modulele implementate în py/ sau modulele de bază. Consultați Extinderea MicroPython în C pentru detalii despre implementarea unui modul extern. Pentru detalii despre modulele specifice unui port, consultați Portarea MicroPython.

Implementarea unui modul de bază#

La fel ca CPython, MicroPython are module de bază încorporate care pot fi accesate prin instrucțiuni import. Un exemplu este modulul gc discutat în Gestionarea memoriei.

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

MicroPython are mai multe alte module standard/de bază încorporate, precum io, array etc. Adăugarea unui nou modul de bază implică mai multe modificări.

Mai întâi, creați fișierul C în directorul py/. În acest exemplu adăugăm un nou modul ipotetic subsystem în fișierul 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

Implementarea include o definiție a tuturor funcțiilor legate de modul și adaugă funcțiile la tabelul global al modulului în mp_module_subsystem_globals_table. De asemenea, creează obiectul modul cu mp_module_subsystem. Modulul este apoi înregistrat în sistemul general prin macro-ul MP_REGISTER_MODULE.

După construirea și rularea MicroPython modificat, modulul ar trebui să poată fi acum importat:

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

Funcția noastră info() returnează în prezent doar un singur număr, dar poate fi extinsă pentru a face orice. În mod similar, mai multe funcții pot fi adăugate la acest nou modul.