Skip to content

Commit 37cc47f

Browse files
HyeockJinKimcorona10
authored andcommitted
Implement range object (#87)
* Add __repr__, __str__ of range __repr__ print start, stop of range if step is not one, step is also printed Fixes #86 * Add __eq__, __ne__ of range __eq__ compare length, start, step of range * Seperate range __repr__ for version constraint strings.Builder is supported since v1.10, so split files for older versions * Add tests for range object
1 parent 261242c commit 37cc47f

File tree

4 files changed

+177
-0
lines changed

4 files changed

+177
-0
lines changed

py/range.go

+63
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,14 @@ func (r *Range) M__iter__() (Object, error) {
104104
}, nil
105105
}
106106

107+
func (r *Range) M__str__() (Object, error) {
108+
return r.M__repr__()
109+
}
110+
111+
func (r *Range) M__repr__() (Object, error) {
112+
return r.repr()
113+
}
114+
107115
func (r *Range) M__len__() (Object, error) {
108116
return r.Length, nil
109117
}
@@ -156,3 +164,58 @@ func computeRangeLength(start, stop, step Int) Int {
156164
var _ I__getitem__ = (*Range)(nil)
157165
var _ I__iter__ = (*Range)(nil)
158166
var _ I_iterator = (*RangeIterator)(nil)
167+
168+
169+
func (a *Range) M__eq__(other Object) (Object, error) {
170+
b, ok := other.(*Range)
171+
if !ok {
172+
return NotImplemented, nil
173+
}
174+
175+
if a.Length != b.Length {
176+
return False, nil
177+
}
178+
179+
if a.Length == 0 {
180+
return True, nil
181+
}
182+
if a.Start != b.Start {
183+
return False, nil
184+
}
185+
186+
if a.Step == 1 {
187+
return True, nil
188+
}
189+
if a.Step != b.Step {
190+
return False, nil
191+
}
192+
193+
return True, nil
194+
}
195+
196+
func (a *Range) M__ne__(other Object) (Object, error) {
197+
b, ok := other.(*Range)
198+
if !ok {
199+
return NotImplemented, nil
200+
}
201+
202+
if a.Length != b.Length {
203+
return True, nil
204+
}
205+
206+
if a.Length == 0 {
207+
return False, nil
208+
}
209+
if a.Start != b.Start {
210+
return True, nil
211+
}
212+
213+
if a.Step == 1 {
214+
return False, nil
215+
}
216+
if a.Step != b.Step {
217+
return True, nil
218+
}
219+
220+
return False, nil
221+
}

py/range_repr110.go

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
// +build go1.10
6+
// Range object
7+
8+
package py
9+
10+
import "strings"
11+
12+
func (r *Range) repr() (Object, error) {
13+
var b strings.Builder
14+
b.WriteString("range(")
15+
start, err := ReprAsString(r.Start)
16+
if err != nil {
17+
return nil, err
18+
}
19+
stop, err := ReprAsString(r.Stop)
20+
if err != nil {
21+
return nil, err
22+
}
23+
b.WriteString(start)
24+
b.WriteString(", ")
25+
b.WriteString(stop)
26+
27+
if r.Step != 1 {
28+
step, err := ReprAsString(r.Step)
29+
if err != nil {
30+
return nil, err
31+
}
32+
b.WriteString(", ")
33+
b.WriteString(step)
34+
}
35+
b.WriteString(")")
36+
37+
return String(b.String()), nil
38+
}

py/range_repr19.go

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
// +build !go1.10
6+
// Range object
7+
8+
package py
9+
10+
import "bytes"
11+
12+
func (r *Range) repr() (Object, error) {
13+
var b bytes.Buffer
14+
b.WriteString("range(")
15+
start, err := ReprAsString(r.Start)
16+
if err != nil {
17+
return nil, err
18+
}
19+
stop, err := ReprAsString(r.Stop)
20+
if err != nil {
21+
return nil, err
22+
}
23+
b.WriteString(start)
24+
b.WriteString(", ")
25+
b.WriteString(stop)
26+
27+
if r.Step != 1 {
28+
step, err := ReprAsString(r.Step)
29+
if err != nil {
30+
return nil, err
31+
}
32+
b.WriteString(", ")
33+
b.WriteString(step)
34+
}
35+
b.WriteString(")")
36+
37+
return String(b.String()), nil
38+
}

py/tests/range.py

+38
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,42 @@
3838
assert b[-2] == 6
3939
assert b[-1] == 8
4040

41+
doc="range_eq"
42+
assert range(10) == range(0, 10)
43+
assert not range(10) == 3
44+
assert range(20) != range(10)
45+
assert range(100, 200, 1) == range(100, 200)
46+
assert range(0, 10, 3) == range(0, 12, 3)
47+
assert range(2000, 100) == range(3, 1)
48+
assert range(0, 10, -3) == range(0, 12, -3)
49+
assert not range(0, 20, 2) == range(0, 20, 4)
50+
try:
51+
range('3', 10) == range(2)
52+
except TypeError:
53+
pass
54+
else:
55+
assert False, "TypeError not raised"
56+
57+
doc="range_ne"
58+
assert range(10, 0, -3) != range(12, 0, -3)
59+
assert range(10) != 3
60+
assert not range(100, 200, 1) != range(100, 200)
61+
assert range(0, 10) != range(0, 12)
62+
assert range(0, 10) != range(0, 10, 2)
63+
assert range(0, 20, 2) != range(0, 21, 2)
64+
assert range(0, 20, 2) != range(0, 20, 4)
65+
assert not range(0, 20, 3) != range(0, 20, 3)
66+
try:
67+
range('3', 10) != range(2)
68+
except TypeError:
69+
pass
70+
else:
71+
assert False, "TypeError not raised"
72+
73+
doc="range_str"
74+
assert str(range(10)) == 'range(0, 10)'
75+
assert str(range(10, 0, 3)) == 'range(10, 0, 3)'
76+
assert str(range(0, 3)) == 'range(0, 3)'
77+
assert str(range(10, 3, -2)) == 'range(10, 3, -2)'
78+
4179
doc="finished"

0 commit comments

Comments
 (0)