Implementar um Módulo¶
Este capítulo detalha como implementar um módulo principal em MicroPython. Os módulos do MicroPython podem ser um dos seguintes:
Módulo integrado: Um módulo geral que faz parte do repositório do MicroPython.
Módulo de utilizador: Um módulo útil para o seu projeto específico que mantém no seu próprio repositório ou base de código privada.
Módulo dinâmico: Um módulo que pode ser implementado e importado em tempo de execução para o seu dispositivo.
Um módulo em MicroPython pode ser implementado num dos seguintes locais:
py/: Uma biblioteca principal que espelha a funcionalidade principal do CPython.
extmod/: Um módulo específico do CPython ou do MicroPython que é partilhado entre múltiplos ports.
ports/<port>/: Um módulo específico do port.
Nota
Este capítulo descreve módulos implementados em py/ ou módulos principais. Consulte Extensão do MicroPython em C para detalhes sobre a implementação de um módulo externo. Para detalhes sobre módulos específicos de ports, consulte Portabilização do MicroPython.
Implementar um módulo principal¶
Tal como o CPython, o MicroPython tem módulos integrados principais que podem ser acedidos através de declarações de importação. Um exemplo é o módulo gc discutido em Gestão de Memória.
>>> import gc
>>> gc.enable()
>>>
O MicroPython tem vários outros módulos padrão/principais integrados como io, array, etc. A adição de um novo módulo principal envolve várias modificações.
Primeiro, crie o ficheiro C no diretório py/. Neste exemplo, estamos a adicionar um novo módulo hipotético subsystem no ficheiro 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
A implementação inclui uma definição de todas as funções relacionadas com o módulo e adiciona as funções à tabela global do módulo em mp_module_subsystem_globals_table. Também cria o objeto módulo com mp_module_subsystem. O módulo é então registado no sistema geral através da macro MP_REGISTER_MODULE.
Após compilar e executar o MicroPython modificado, o módulo deverá agora ser importável:
>>> import subsystem
>>> subsystem.info()
42
>>>
A nossa função info() atualmente retorna apenas um único número, mas pode ser alargada para fazer qualquer coisa. Da mesma forma, podem ser adicionadas mais funções a este novo módulo.