将类添加到micropython模块

时间:2018-01-21 11:13:04

标签: micropython

在参考adding module in micropython时,我试图创建一个具有本地方法的类。在文档中给出了如何添加本地方法以及第一个参数应该是mp_obj_t类型,这是数据结构本身。但是,我问我怎样才能像其他方法一样传递额外的参数?我尝试使用mp_obj_t * args作为第二个参数,但STATIC MP_DEFINE_CONST_FUN_OBJ_1给出了错误。我对STATIC MP_DEFINE_CONST_FUN_OBJ_VAR尝试了同样的操作,但它不支持将mp_obt_t作为第一个参数传递,因为STATIC MP_DEFINE_CONST_FUN_OBJ_VAR需要int。我很新,所以我问如何向可以接受参数的类添加方法?

2 个答案:

答案 0 :(得分:0)

您需要MP_DEFINE_CONST_FUN_OBJ_2,因为您有2个参数。 像

这样的东西
STATIC mp_obj_t my_class_func(mp_obj_t self, mp_obj_t arg) {
  if (MP_OBJ_IS_SMALL_INT(lhs)) {
    const mp_int_t lhs_val = MP_OBJ_SMALL_INT_VALUE(arg);
    //...
  } else {
    //oops, not an int
  }
  return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(my_class_func_obj, my_class_func);

这样的样本的最佳来源是源代码btw。

答案 1 :(得分:0)

详细说明@stijn 的回答~在创建类时,所有 MP_DEFINE_CONST_FUN_OBJ_XXXXXX 定义的工作与您不创建类时完全相同。唯一的区别是 ACTUAL 参数的第一个参数将始终引用 self

这是一个例子:

mp_obj_t Class_method(mp_uint_t n_args, const mp_obj_t *args) { ... }

这是标准候选人:

MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(Class_method_obj, 1, 3, Class_method);

但是,在这种情况下,args[0] 将是 self

再举一个例子。

mp_obj_t Class_method(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { ... }

这是这个定义的主要候选

MP_DEFINE_CONST_FUN_OBJ_KW(Class_method_obj, 2, Class_method);

这种情况的唯一区别是 allowed_args 的第一个索引需要自动处理为 self。除了现在第一个 ACTUAL 参数(即不包括 n_args 或任何其他“helper”参数)需要自动被视为 self 之外,您如何做这些事情没有任何改变。话虽如此,您永远不会将 MP_DEFINE_CONST_FUN_OBJ_0 与类方法一起使用。 '_0' 表示“零参数”,类方法永远不会有零参数,因为它总是至少有 self。这也意味着您必须在 python 端的预期参数中添加一个。如果你的 python 版本接受 3 个参数 ~

(red, green, blue)

那么你的 C_MODULE 定义必须从 4 开始,因为它会得到

(self, red, green, blue)