diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2019-12-13 16:00:04 -0800 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2019-12-13 16:00:04 -0800 |
| commit | d8e66a5f32749f29f5274432c616b2bd001dc7b3 (patch) | |
| tree | 2ad6468ef5890ddcc217ee467edf46f6b311355e /py/objnamedtuple.c | |
| parent | 7f7105d36d5775e6b7842a24f06604a229b2aae3 (diff) | |
try 2. make namedtuple types handle subclasses
Diffstat (limited to 'py/objnamedtuple.c')
| -rw-r--r-- | py/objnamedtuple.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c index a044fe3ff..a0a64f9b2 100644 --- a/py/objnamedtuple.c +++ b/py/objnamedtuple.c @@ -31,6 +31,7 @@ #include "py/runtime.h" #include "py/objstr.h" #include "py/objnamedtuple.h" +#include "py/objtype.h" #include "supervisor/shared/translate.h" @@ -70,6 +71,15 @@ void namedtuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t ki mp_obj_attrtuple_print_helper(print, fields, &o->tuple); } +mp_obj_t namedtuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { + mp_obj_type_t *type = mp_obj_get_type(self_in); + // Check for subclasses of namedtuple and unpack if needed. + if (type->parent != &mp_type_tuple) { + self_in = ((mp_obj_instance_t*) self_in)->subobj[0]; + } + return mp_obj_tuple_subscr(self_in, index, value); +} + void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { if (dest[0] == MP_OBJ_NULL) { // load attribute @@ -167,7 +177,7 @@ STATIC mp_obj_t mp_obj_new_namedtuple_type(qstr name, size_t n_fields, mp_obj_t o->base.unary_op = mp_obj_tuple_unary_op; o->base.binary_op = mp_obj_tuple_binary_op; o->base.attr = namedtuple_attr; - o->base.subscr = mp_obj_tuple_subscr; + o->base.subscr = namedtuple_subscr; o->base.getiter = mp_obj_tuple_getiter; o->base.parent = &mp_type_tuple; return MP_OBJ_FROM_PTR(o); |
