מימוש מודול

פרק זה מפרט כיצד לממש מודול ליבה ב-MicroPython. מודולים של MicroPython יכולים להיות אחד מהבאים:

  • מודול מובנה: מודול כללי שהוא חלק ממאגר MicroPython.

  • מודול משתמש: מודול שימושי עבור הפרויקט הספציפי שלכם שאתם מתחזקים במאגר משלכם או בבסיס קוד פרטי.

  • מודול דינמי: מודול שניתן לפרוס ולייבא בזמן ריצה אל ההתקן שלכם.

מודול ב-MicroPython יכול להיות ממומש באחד מהמיקומים הבאים:

  • py/: ספריית ליבה המשקפת פונקציונליות ליבה של CPython.

  • extmod/: מודול ספציפי ל-CPython או ל-MicroPython המשותף בין מספר ports.

  • ports/<port>/: מודול ספציפי ל-port.

הערה

פרק זה מתאר מודולים הממומשים ב-py/ או מודולי ליבה. ראו הרחבת MicroPython ב-C לפרטים על מימוש מודול חיצוני. לפרטים על מודולים ספציפיים ל-port, ראו הסבת (porting) MicroPython.

מימוש מודול ליבה

כמו CPython, ל-MicroPython יש מודולי ליבה מובנים שניתן לגשת אליהם באמצעות הצהרות import. דוגמה לכך היא מודול gc הנדון בניהול זיכרון.

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

ל-MicroPython יש כמה מודולי ליבה/סטנדרט מובנים נוספים כגון io, array וכדומה. הוספת מודול ליבה חדש כרוכה במספר שינויים.

ראשית, צרו את קובץ ה-C בספריית py/. בדוגמה זו אנו מוסיפים מודול חדש היפותטי subsystem בקובץ 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

המימוש כולל הגדרה של כל הפונקציות הקשורות למודול ומוסיף את הפונקציות לטבלה הגלובלית של המודול ב-mp_module_subsystem_globals_table. הוא גם יוצר את אובייקט המודול באמצעות mp_module_subsystem. המודול נרשם לאחר מכן במערכת הרחבה יותר באמצעות המאקרו MP_REGISTER_MODULE.

לאחר בניית והרצת ה-MicroPython המעודכן, המודול אמור כעת להיות ניתן לייבוא:

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

פונקציית ה-info() שלנו מחזירה כעת רק מספר יחיד אך ניתן להרחיב אותה לבצע כל דבר. באופן דומה, ניתן להוסיף פונקציות נוספות למודול חדש זה.