Skip to content

Commit d9e9504

Browse files
committed
py: Support __len__ of rangetype.
1 parent f7ea0a4 commit d9e9504

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

py/range.go

+20
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,26 @@ func (r *Range) M__iter__() (Object, error) {
8282
}, nil
8383
}
8484

85+
func (r *Range) M__len__() (Object, error) {
86+
var lo, hi, step Int
87+
if r.Step > 0 {
88+
lo = r.Start
89+
hi = r.Stop
90+
step = r.Step
91+
} else {
92+
lo = r.Stop
93+
hi = r.Start
94+
step = (-r.Step)
95+
}
96+
97+
if lo >= hi {
98+
return Int(0), nil
99+
}
100+
101+
res := (hi-lo-1)/step + 1
102+
return res, nil
103+
}
104+
85105
// Range iterator
86106
func (it *RangeIterator) M__iter__() (Object, error) {
87107
return it, nil

py/tests/range.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Copyright 2018 The go-python Authors. All rights reserved.
2+
# Use of this source code is governed by a BSD-style
3+
# license that can be found in the LICENSE file.
4+
5+
doc="range"
6+
a = range(255)
7+
b = [e for e in a]
8+
assert len(a) == len(b)
9+
a = range(5, 100, 5)
10+
b = [e for e in a]
11+
assert len(a) == len(b)
12+
a = range(100 ,0, 1)
13+
b = [e for e in a]
14+
assert len(a) == len(b)
15+
16+
doc="finished"

0 commit comments

Comments
 (0)