在参考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
。我很新,所以我问如何向可以接受参数的类添加方法?
答案 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)