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

Lines changed: 63 additions & 0 deletions
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

Lines changed: 38 additions & 0 deletions
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

Lines changed: 38 additions & 0 deletions
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

Lines changed: 38 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy