1

我正在创建一个新的数据类型。

我正在创建的 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

4

0 回答 0