0

关于在 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. 我很新,所以我在问如何向可以接受参数的类添加方法?

4

2 回答 2

1

您需要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);

像这样的示例的最佳来源是源代码顺便说一句。

于 2018-01-23T11:32:56.583 回答
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或任何其他“帮助”参数)需要自动被视为self. 话虽如此,您永远不会使用MP_DEFINE_CONST_FUN_OBJ_0类方法。'_0' 表示“零参数”,类方法永远不会有零参数,因为它总是至少有self. 这也意味着您必须在 python 端的许多预期参数中添加一个。如果你的 python 版本接受 3 个参数 ~

(red, green, blue)

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

(self, red, green, blue)
于 2021-04-07T06:22:03.073 回答