Implementacija modula

Ovo poglavlje detaljno opisuje kako implementirati osnovni modul u MicroPythonu. MicroPython moduli mogu biti jedan od sljedećih:

  • Ugrađeni modul: Općeniti modul koji je dio MicroPython repozitorija.

  • Korisnički modul: Modul koristan za vaš određeni projekt koji održavate u vlastitom repozitoriju ili privatnoj bazi koda.

  • Dinamički modul: Modul koji se može postaviti i uvesti tijekom izvođenja na vaš uređaj.

Modul u MicroPythonu može se implementirati na jednoj od sljedećih lokacija:

  • py/: Osnovna biblioteka koja zrcali osnovnu funkcionalnost CPythona.

  • extmod/: Modul specifičan za CPython ili MicroPython koji se dijeli između više portova.

  • ports/<port>/: Modul specifičan za port.

Napomena

Ovo poglavlje opisuje module implementirane u py/ ili osnovne module. Za pojedinosti o implementaciji vanjskog modula pogledajte Proširivanje MicroPythona u C-u. Za pojedinosti o modulima specifičnima za port pogledajte Prenošenje MicroPythona.

Implementacija osnovnog modula

Kao i CPython, MicroPython ima osnovne ugrađene module kojima se može pristupiti pomoću import izjava. Primjer je modul gc o kojem se govori u Upravljanje memorijom.

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

MicroPython ima i nekoliko drugih ugrađenih standardnih/osnovnih modula poput io, array itd. Dodavanje novog osnovnog modula uključuje nekoliko izmjena.

Najprije stvorite C datoteku u py/ direktoriju. U ovom primjeru dodajemo hipotetski novi modul subsystem u datoteci 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

Implementacija uključuje definiciju svih funkcija vezanih uz modul i dodaje funkcije u modulovu globalnu tablicu u mp_module_subsystem_globals_table. Također stvara objekt modula pomoću mp_module_subsystem. Modul se zatim registrira u širem sustavu putem makronaredbe MP_REGISTER_MODULE.

Nakon izgradnje i pokretanja izmijenjenog MicroPythona, modul bi sada trebao biti dostupan za uvoz:

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

Naša funkcija info() trenutno vraća samo jedan broj, ali može se proširiti da radi bilo što. Slično tome, ovom novom modulu mogu se dodati i dodatne funkcije.