objdict: Implement construction from iterable of pairs.

Pairs are limited to tuples so far.
pull/465/head
Paul Sokolovsky 2014-04-11 07:01:15 +03:00
rodzic 12a04392b9
commit be019ce063
2 zmienionych plików z 17 dodań i 3 usunięć

Wyświetl plik

@ -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,22 @@ 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_tuple_t *item;
while ((item = mp_iternext(iterable)) != MP_OBJ_NULL) {
mp_obj_dict_store(dict, item->items[0], item->items[1]);
}
return dict;
}
default:
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "dict takes at most 1 argument"));

Wyświetl plik

@ -0,0 +1,4 @@
print(dict([(1, "foo")]))
d = dict([("foo", "foo2"), ("bar", "baz")])
print(sorted(d.keys()))
print(sorted(d.values()))