summaryrefslogtreecommitdiff
path: root/py/objnamedtuple.c
diff options
context:
space:
mode:
authorstijn <stijn@ignitron.net>2017-11-06 12:21:53 +0100
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-11-12 14:16:54 +0200
commit79ed58f87b008ed1ad75c611686ca8bebfe2a817 (patch)
treeaf11d8a624bf55ea5669e0e5219248635325ef26 /py/objnamedtuple.c
parentcada971113e6db0cf9e0751e95dbe9217dd707b5 (diff)
py/objnamedtuple: Add _asdict function if OrderedDict is supported
Diffstat (limited to 'py/objnamedtuple.c')
-rw-r--r--py/objnamedtuple.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c
index 38daccdf2..94f02dd69 100644
--- a/py/objnamedtuple.c
+++ b/py/objnamedtuple.c
@@ -52,6 +52,23 @@ STATIC size_t namedtuple_find_field(const mp_obj_namedtuple_type_t *type, qstr n
return (size_t)-1;
}
+#if MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT
+STATIC mp_obj_t namedtuple_asdict(mp_obj_t self_in) {
+ mp_obj_namedtuple_t *self = MP_OBJ_TO_PTR(self_in);
+ const qstr *fields = ((mp_obj_namedtuple_type_t*)self->tuple.base.type)->fields;
+ mp_obj_t dict = mp_obj_new_dict(self->tuple.len);
+ //make it an OrderedDict
+ mp_obj_dict_t *dictObj = MP_OBJ_TO_PTR(dict);
+ dictObj->base.type = &mp_type_ordereddict;
+ dictObj->map.is_ordered = 1;
+ for (size_t i = 0; i < self->tuple.len; ++i) {
+ mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(fields[i]), self->tuple.items[i]);
+ }
+ return dict;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(namedtuple_asdict_obj, namedtuple_asdict);
+#endif
+
STATIC void namedtuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind) {
(void)kind;
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) {
if (dest[0] == MP_OBJ_NULL) {
// load attribute
mp_obj_namedtuple_t *self = MP_OBJ_TO_PTR(self_in);
+ #if MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT
+ if (attr == MP_QSTR__asdict) {
+ dest[0] = MP_OBJ_FROM_PTR(&namedtuple_asdict_obj);
+ dest[1] = self_in;
+ return;
+ }
+ #endif
size_t id = namedtuple_find_field((mp_obj_namedtuple_type_t*)self->tuple.base.type, attr);
if (id == (size_t)-1) {
return;