|
31 | 31 | #include "py/runtime.h"
|
32 | 32 | #include "py/objstr.h"
|
33 | 33 | #include "py/objnamedtuple.h"
|
| 34 | +#include "py/objtype.h" |
34 | 35 |
|
35 | 36 | #include "supervisor/shared/translate.h"
|
36 | 37 |
|
@@ -70,6 +71,15 @@ void namedtuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t ki
|
70 | 71 | mp_obj_attrtuple_print_helper(print, fields, &o->tuple);
|
71 | 72 | }
|
72 | 73 |
|
| 74 | +mp_obj_t namedtuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { |
| 75 | + mp_obj_type_t *type = mp_obj_get_type(self_in); |
| 76 | + // Check for subclasses of namedtuple and unpack if needed. |
| 77 | + if (type->parent != &mp_type_tuple) { |
| 78 | + self_in = ((mp_obj_instance_t*) self_in)->subobj[0]; |
| 79 | + } |
| 80 | + return mp_obj_tuple_subscr(self_in, index, value); |
| 81 | +} |
| 82 | + |
73 | 83 | void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
|
74 | 84 | if (dest[0] == MP_OBJ_NULL) {
|
75 | 85 | // load attribute
|
@@ -167,7 +177,7 @@ STATIC mp_obj_t mp_obj_new_namedtuple_type(qstr name, size_t n_fields, mp_obj_t
|
167 | 177 | o->base.unary_op = mp_obj_tuple_unary_op;
|
168 | 178 | o->base.binary_op = mp_obj_tuple_binary_op;
|
169 | 179 | o->base.attr = namedtuple_attr;
|
170 |
| - o->base.subscr = mp_obj_tuple_subscr; |
| 180 | + o->base.subscr = namedtuple_subscr; |
171 | 181 | o->base.getiter = mp_obj_tuple_getiter;
|
172 | 182 | o->base.parent = &mp_type_tuple;
|
173 | 183 | return MP_OBJ_FROM_PTR(o);
|
|
0 commit comments