diff --git a/py/dict.go b/py/dict.go index a849973f..f2b93d26 100644 --- a/py/dict.go +++ b/py/dict.go @@ -27,6 +27,17 @@ var ( expectingDict = ExceptionNewf(TypeError, "a dict is required") ) +func init() { + StringDictType.Dict["items"] = MustNewMethod("items", func(self Object, args Tuple) (Object, error) { + sMap := self.(StringDict) + o := make([]Object, 0, len(sMap)) + for k, v := range sMap { + o = append(o, Tuple{String(k), v}) + } + return NewIterator(o), nil + }, 0, "items() -> list of D's (key, value) pairs, as 2-tuples") +} + // String to object dictionary // // Used for variables etc where the keys can only be strings @@ -100,6 +111,15 @@ func (a StringDict) M__repr__() (Object, error) { return String(out.String()), nil } +// Returns a list of keys from the dict +func (d StringDict) M__iter__() (Object, error) { + o := make([]Object, 0, len(d)) + for k := range d { + o = append(o, String(k)) + } + return NewIterator(o), nil +} + func (d StringDict) M__getitem__(key Object) (Object, error) { str, ok := key.(String) if ok { diff --git a/py/tests/dict.py b/py/tests/dict.py index 3581ba53..dcd1f2c9 100644 --- a/py/tests/dict.py +++ b/py/tests/dict.py @@ -12,4 +12,20 @@ a = repr({"a":"b","c":5.5}) assert a == "{'a': 'b', 'c': 5.5}" or a == "{'c': 5.5, 'a': 'b'}" +doc="check __iter__" +a = {"a":"b","c":5.5} +l = list(iter(a)) +assert "a" in l +assert "c" in l +assert len(l) == 2 + +doc="check items" +a = {"a":"b","c":5.5} +for k, v in a.items(): + assert k in ["a", "c"] + if k == "a": + assert v == "b" + if k == "c": + assert v == 5.5 + doc="finished"