Mengimplementasikan Modul#

Bab ini menjelaskan cara mengimplementasikan modul inti di MicroPython. Modul MicroPython dapat berupa salah satu dari berikut:

  • Modul built-in: Modul umum yang merupakan bagian dari repositori MicroPython.

  • Modul pengguna: Modul yang berguna untuk proyek spesifik Anda yang Anda pelihara di repositori Anda sendiri atau basis kode privat.

  • Modul dinamis: Modul yang dapat di-deploy dan diimpor saat runtime ke perangkat Anda.

Modul di MicroPython dapat diimplementasikan di salah satu lokasi berikut:

  • py/: Pustaka inti yang mencerminkan fungsionalitas inti CPython.

  • extmod/: Modul khusus CPython atau MicroPython yang dibagikan di berbagai port.

  • ports/<port>/: Modul khusus port.

Catatan

Bab ini menjelaskan modul yang diimplementasikan di py/ atau modul inti. Lihat Memperluas MicroPython dalam C untuk detail tentang mengimplementasikan modul eksternal. Untuk detail tentang modul khusus port, lihat Melakukan Porting MicroPython.

Mengimplementasikan modul inti#

Seperti CPython, MicroPython memiliki modul builtin inti yang dapat diakses melalui pernyataan import. Contohnya adalah modul gc yang dibahas di Manajemen Memori.

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

MicroPython memiliki beberapa modul standar/inti builtin lainnya seperti io, array, dll. Menambahkan modul inti baru melibatkan beberapa modifikasi.

Pertama, buat file C di direktori py/. Dalam contoh ini kita menambahkan modul baru hipotetis subsystem di file 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

Implementasi mencakup definisi semua fungsi yang terkait dengan modul dan menambahkan fungsi ke tabel global modul di mp_module_subsystem_globals_table. Ini juga membuat objek modul dengan mp_module_subsystem. Modul kemudian didaftarkan dengan sistem yang lebih luas melalui makro MP_REGISTER_MODULE.

Setelah membangun dan menjalankan MicroPython yang telah dimodifikasi, modul sekarang harus dapat diimpor:

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

Fungsi info() kami saat ini hanya mengembalikan satu angka tetapi dapat diperluas untuk melakukan apa saja. Demikian pula, lebih banyak fungsi dapat ditambahkan ke modul baru ini.