diff options
Diffstat (limited to 'py/objdict.c')
-rw-r--r-- | py/objdict.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/py/objdict.c b/py/objdict.c index 85986448c7..963e188074 100644 --- a/py/objdict.c +++ b/py/objdict.c @@ -7,6 +7,7 @@ #include "mpconfig.h" #include "qstr.h" #include "obj.h" +#include "objtuple.h" #include "runtime0.h" #include "runtime.h" @@ -39,13 +40,24 @@ STATIC mp_obj_t dict_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp dict = mp_obj_new_dict(0); break; - case 1: + case 1: { if (MP_OBJ_IS_TYPE(args[0], &mp_type_dict)) { return dict_copy(args[0]); } // TODO create dict from an arbitrary mapping! - // TODO create dict from an iterable! - assert(false); + + // Make dict from iterable of pairs + mp_obj_t iterable = mp_getiter(args[0]); + mp_obj_t dict = mp_obj_new_dict(0); + // TODO: support arbitrary seq as a pair + mp_obj_t item; + while ((item = mp_iternext(iterable)) != MP_OBJ_NULL) { + mp_obj_t *sub_items; + mp_obj_get_array_fixed_n(item, 2, &sub_items); + mp_obj_dict_store(dict, sub_items[0], sub_items[1]); + } + return dict; + } default: nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "dict takes at most 1 argument")); @@ -123,6 +135,12 @@ STATIC bool dict_store_item(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { return true; } +STATIC mp_obj_t dict_getitem(mp_obj_t lhs_in, mp_obj_t rhs_in) { + return dict_binary_op(MP_BINARY_OP_SUBSCR, lhs_in, rhs_in); +} + +STATIC MP_DEFINE_CONST_FUN_OBJ_2(dict_getitem_obj, dict_getitem); + /******************************************************************************/ /* dict iterator */ @@ -481,6 +499,7 @@ STATIC const mp_map_elem_t dict_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_setdefault), (mp_obj_t)&dict_setdefault_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_update), (mp_obj_t)&dict_update_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_values), (mp_obj_t)&dict_values_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR___getitem__), (mp_obj_t)&dict_getitem_obj }, }; STATIC MP_DEFINE_CONST_DICT(dict_locals_dict, dict_locals_dict_table); |