تنفيذ وحدة#
يفصّل هذا الفصل كيفية تنفيذ وحدة أساسية في 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() الخاصة بنا حاليًا رقمًا واحدًا فقط ولكن يمكن توسيعها لتقوم بأي شيء. وبالمثل، يمكن إضافة المزيد من الدوال إلى هذه الوحدة الجديدة.