Implementando um Módulo

Este capítulo detalha como implementar um módulo principal no MicroPython. Os módulos do MicroPython podem ser um dos seguintes:

  • Módulo embutido: Um módulo geral que faz parte do repositório do MicroPython.

  • Módulo de usuário: Um módulo útil para o seu projeto específico, que você mantém em seu próprio repositório ou base de código privada.

  • Módulo dinâmico: Um módulo que pode ser implantado e importado em tempo de execução no seu dispositivo.

Um módulo no MicroPython pode ser implementado em um 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 é compartilhado entre vários ports.

  • ports/<port>/: Um módulo específico de um port.

Nota

Este capítulo descreve módulos implementados em py/ ou módulos principais. Veja Estendendo o MicroPython em C para detalhes sobre como implementar um módulo externo. Para detalhes sobre módulos específicos de um port, veja Portando o MicroPython.

Implementando um módulo principal

Assim como o CPython, o MicroPython tem módulos embutidos principais que podem ser acessados por meio de instruções import. Um exemplo é o módulo gc discutido em Gerenciamento de Memória.

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

O MicroPython tem vários outros módulos padrão/principais embutidos, como io, array, etc. Adicionar um novo módulo principal envolve várias modificações.

Primeiro, crie o arquivo C no diretório py/. Neste exemplo, estamos adicionando um novo módulo hipotético subsystem no arquivo 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 ao módulo e adiciona as funções à tabela global do módulo em mp_module_subsystem_globals_table. Ela também cria o objeto do módulo com mp_module_subsystem. O módulo é então registrado no sistema mais amplo por meio da macro MP_REGISTER_MODULE.

Após compilar e executar o MicroPython modificado, o módulo agora deve poder ser importado:

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

Nossa função info() atualmente retorna apenas um único número, mas pode ser estendida para fazer qualquer coisa. Da mesma forma, mais funções podem ser adicionadas a este novo módulo.