关于在 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 回答
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 回答