Skip to content

Commit 7f6244e

Browse files
kellrottncw
authored andcommitted
Adding __iter__ and items methods to Dict
1 parent f76e37b commit 7f6244e

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

py/dict.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@ var (
2727
expectingDict = ExceptionNewf(TypeError, "a dict is required")
2828
)
2929

30+
func init() {
31+
StringDictType.Dict["items"] = MustNewMethod("items", func(self Object, args Tuple) (Object, error) {
32+
sMap := self.(StringDict)
33+
o := make([]Object, 0, len(sMap))
34+
for k, v := range sMap {
35+
o = append(o, Tuple{String(k), v})
36+
}
37+
return NewIterator(o), nil
38+
}, 0, "items() -> list of D's (key, value) pairs, as 2-tuples")
39+
}
40+
3041
// String to object dictionary
3142
//
3243
// Used for variables etc where the keys can only be strings
@@ -100,6 +111,15 @@ func (a StringDict) M__repr__() (Object, error) {
100111
return String(out.String()), nil
101112
}
102113

114+
// Returns a list of keys from the dict
115+
func (d StringDict) M__iter__() (Object, error) {
116+
o := make([]Object, 0, len(d))
117+
for k := range d {
118+
o = append(o, String(k))
119+
}
120+
return NewIterator(o), nil
121+
}
122+
103123
func (d StringDict) M__getitem__(key Object) (Object, error) {
104124
str, ok := key.(String)
105125
if ok {

py/tests/dict.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,20 @@
1212
a = repr({"a":"b","c":5.5})
1313
assert a == "{'a': 'b', 'c': 5.5}" or a == "{'c': 5.5, 'a': 'b'}"
1414

15+
doc="check __iter__"
16+
a = {"a":"b","c":5.5}
17+
l = list(iter(a))
18+
assert "a" in l
19+
assert "c" in l
20+
assert len(l) == 2
21+
22+
doc="check items"
23+
a = {"a":"b","c":5.5}
24+
for k, v in a.items():
25+
assert k in ["a", "c"]
26+
if k == "a":
27+
assert v == "b"
28+
if k == "c":
29+
assert v == 5.5
30+
1531
doc="finished"

0 commit comments

Comments
 (0)