我正在创建一个新的数据类型。
我正在创建的 Python 原生类型是:can_message
它只有两个成员(目前),我希望它们的行为类似于结构中的元素。
msg_id
是一个int
msg_data
是一个list
但是,在表中对于 type 的这两个条目can_message
,我不知道这两个qstr
应该映射到什么两个:
我很确定这两个条目的映射都是错误的:当前条目说这
msg_id
是该类型的别名int
并且msg_data
是该类型的别名list
STATIC const mp_rom_map_elem_t can_message_type_locals_dict_table[] =
{
{MP_ROM_QSTR(MP_QSTR_msg_id), MP_ROM_PTR(&mp_type_int)},
{MP_ROM_QSTR(MP_QSTR_msg_data), MP_ROM_PTR(&mp_type_list)},
};
STATIC MP_DEFINE_CONST_DICT(can_message_type_locals_dict, can_message_type_locals_dict_table);
const mp_obj_type_t can_message_type =
{
{&mp_type_type},
.name = MP_QSTR_message,
.print = can_message_obj_print,
.make_new = can_message_make_new,
.locals_dict = (mp_obj_t)&can_message_type_locals_dict,
.attr = can_message_attr
};
Python:
dir(can_message)
# list('msg_id', 'msg_data')
msg = can_message()
dir(msg)
# list('msg_id', 'msg_data')
这种方式dir()
有效——是的,我已经通过 C 代码进行了追踪——在这两种情况下,它都使用相同的can_message_type_locals_dict_table
我希望用户能够执行以下操作。
msg = can_message()
msg.msg_id = 55
msg.msg_data = [1, 54, 25, 3, 5,3, 2, 2]
我跟踪代码并被mp_store_attr
调用,然后调用我应该编写的函数(我确实这样做了),以确保您不能添加新属性,即msg.asdfsaf = 99
.
问题
当它所代表的基础对象是可以分配的数据项时,can_message_type_locals_dict_table
我将每个映射到什么?qstr