تنفيذ وحدة¶
يفصّل هذا الفصل كيفية تنفيذ وحدة أساسية في MicroPython. يمكن أن تكون وحدات MicroPython واحدة مما يلي:
وحدة مدمجة: وحدة عامة تشكل جزءًا من مستودع MicroPython.
وحدة مستخدم: وحدة مفيدة لمشروعك المحدد تحتفظ بها في مستودعك الخاص أو في قاعدة شيفرة خاصة بك.
وحدة ديناميكية: وحدة يمكن نشرها واستيرادها في وقت التشغيل إلى جهازك.
يمكن تنفيذ وحدة في MicroPython في أحد المواضع التالية:
py/: مكتبة أساسية تعكس الوظائف الأساسية لـ CPython.
extmod/: وحدة خاصة بـ CPython أو MicroPython تتم مشاركتها عبر منافذ متعددة.
ports/<port>/: وحدة خاصة بمنفذ.
ملاحظة
يصف هذا الفصل الوحدات المنفَّذة في py/ أو الوحدات الأساسية. راجع توسيع MicroPython بلغة C للحصول على تفاصيل حول تنفيذ وحدة خارجية. للحصول على تفاصيل حول الوحدات الخاصة بالمنافذ، راجع نقل MicroPython (Porting).
تنفيذ وحدة أساسية¶
مثل 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() الخاصة بنا حاليًا رقمًا واحدًا فقط ولكن يمكن توسيعها لتقوم بأي شيء. وبالمثل، يمكن إضافة المزيد من الدوال إلى هذه الوحدة الجديدة.