Skip to content

Commit 9985b49

Browse files
corona10ncw
authored andcommitted
py: Implement range M__getitem__
1 parent d8a0825 commit 9985b49

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

py/range.go

+25
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,24 @@ func RangeNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) {
7878
}, nil
7979
}
8080

81+
func (r *Range) M__getitem__(key Object) (Object, error) {
82+
index, err := Index(key)
83+
if err != nil {
84+
return nil, err
85+
}
86+
// TODO(corona10): Support slice case
87+
length := computeRangeLength(r.Start, r.Stop, r.Step)
88+
if index < 0 {
89+
index += length
90+
}
91+
92+
if index < 0 || index >= length {
93+
return nil, ExceptionNewf(TypeError, "range object index out of range")
94+
}
95+
result := computeItem(r, index)
96+
return result, nil
97+
}
98+
8199
// Make a range iterator from a range
82100
func (r *Range) M__iter__() (Object, error) {
83101
return &RangeIterator{
@@ -109,6 +127,12 @@ func (it *RangeIterator) M__next__() (Object, error) {
109127
return r, nil
110128
}
111129

130+
func computeItem(r *Range, item Int) Int {
131+
incr := item * r.Step
132+
res := r.Start + incr
133+
return res
134+
}
135+
112136
func computeRangeLength(start, stop, step Int) Int {
113137
var lo, hi Int
114138
if step > 0 {
@@ -129,5 +153,6 @@ func computeRangeLength(start, stop, step Int) Int {
129153
}
130154

131155
// Check interface is satisfied
156+
var _ I__getitem__ = (*Range)(nil)
132157
var _ I__iter__ = (*Range)(nil)
133158
var _ I_iterator = (*RangeIterator)(nil)

py/tests/range.py

+20
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,24 @@
1818
assert len(a) == 100
1919
assert len(b) == 100
2020

21+
doc="range_get_item"
22+
a = range(3)
23+
assert a[2] == 2
24+
assert a[1] == 1
25+
assert a[0] == 0
26+
assert a[-1] == 2
27+
assert a[-2] == 1
28+
assert a[-3] == 0
29+
30+
b = range(0, 10, 2)
31+
assert b[4] == 8
32+
assert b[3] == 6
33+
assert b[2] == 4
34+
assert b[1] == 2
35+
assert b[0] == 0
36+
assert b[-4] == 2
37+
assert b[-3] == 4
38+
assert b[-2] == 6
39+
assert b[-1] == 8
40+
2141
doc="finished"

0 commit comments

Comments
 (0)