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.