@@ -52,6 +52,23 @@ STATIC size_t namedtuple_find_field(const mp_obj_namedtuple_type_t *type, qstr n
5252 return (size_t )-1 ;
5353}
5454
55+ #if MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT
56+ STATIC mp_obj_t namedtuple_asdict (mp_obj_t self_in ) {
57+ mp_obj_namedtuple_t * self = MP_OBJ_TO_PTR (self_in );
58+ const qstr * fields = ((mp_obj_namedtuple_type_t * )self -> tuple .base .type )-> fields ;
59+ mp_obj_t dict = mp_obj_new_dict (self -> tuple .len );
60+ //make it an OrderedDict
61+ mp_obj_dict_t * dictObj = MP_OBJ_TO_PTR (dict );
62+ dictObj -> base .type = & mp_type_ordereddict ;
63+ dictObj -> map .is_ordered = 1 ;
64+ for (size_t i = 0 ; i < self -> tuple .len ; ++ i ) {
65+ mp_obj_dict_store (dict , MP_OBJ_NEW_QSTR (fields [i ]), self -> tuple .items [i ]);
66+ }
67+ return dict ;
68+ }
69+ MP_DEFINE_CONST_FUN_OBJ_1 (namedtuple_asdict_obj , namedtuple_asdict );
70+ #endif
71+
5572STATIC void namedtuple_print (const mp_print_t * print , mp_obj_t o_in , mp_print_kind_t kind ) {
5673 (void )kind ;
5774 mp_obj_namedtuple_t * o = MP_OBJ_TO_PTR (o_in );
@@ -64,6 +81,13 @@ STATIC void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
6481 if (dest [0 ] == MP_OBJ_NULL ) {
6582 // load attribute
6683 mp_obj_namedtuple_t * self = MP_OBJ_TO_PTR (self_in );
84+ #if MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT
85+ if (attr == MP_QSTR__asdict ) {
86+ dest [0 ] = MP_OBJ_FROM_PTR (& namedtuple_asdict_obj );
87+ dest [1 ] = self_in ;
88+ return ;
89+ }
90+ #endif
6791 size_t id = namedtuple_find_field ((mp_obj_namedtuple_type_t * )self -> tuple .base .type , attr );
6892 if (id == (size_t )-1 ) {
6993 return ;
0 commit comments