summaryrefslogtreecommitdiffstatshomepage
path: root/py/objdict.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objdict.c')
-rw-r--r--py/objdict.c25
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);