From 0ff757f7620643b1bf7ff452272abc631c0eb2cb Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Fri, 20 Sep 2019 18:47:35 +0900 Subject: [PATCH 1/4] Add __repr__, __str__ of range __repr__ print start, stop of range if step is not one, step is also printed Fixes #86 --- py/range.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/py/range.go b/py/range.go index d3d94102..eba65d7d 100644 --- a/py/range.go +++ b/py/range.go @@ -6,6 +6,10 @@ package py +import ( + "strings" +) + // A python Range object // FIXME one day support BigInts too! type Range struct { @@ -104,6 +108,42 @@ func (r *Range) M__iter__() (Object, error) { }, nil } +func (r *Range) M__str__() (Object, error) { + return r.M__repr__() +} + +func (r *Range) repr() (Object, error) { + var b strings.Builder + b.WriteString("range(") + start, err := ReprAsString(r.Start) + if err != nil { + return nil, err + } + stop, err := ReprAsString(r.Stop) + if err != nil { + return nil, err + } + b.WriteString(start) + b.WriteString(", ") + b.WriteString(stop) + + if r.Step != 1 { + step, err := ReprAsString(r.Step) + if err != nil { + return nil, err + } + b.WriteString(", ") + b.WriteString(step) + } + b.WriteString(")") + + return String(b.String()), nil +} + +func (r *Range) M__repr__() (Object, error) { + return r.repr() +} + func (r *Range) M__len__() (Object, error) { return r.Length, nil } From c4de1c83ca51ed5181fa27f498a88e14f29d4c1d Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Fri, 20 Sep 2019 22:59:35 +0900 Subject: [PATCH 2/4] Add __eq__, __ne__ of range __eq__ compare length, start, step of range --- py/range.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/py/range.go b/py/range.go index eba65d7d..ad6717dd 100644 --- a/py/range.go +++ b/py/range.go @@ -196,3 +196,58 @@ func computeRangeLength(start, stop, step Int) Int { var _ I__getitem__ = (*Range)(nil) var _ I__iter__ = (*Range)(nil) var _ I_iterator = (*RangeIterator)(nil) + + +func (a *Range) M__eq__(other Object) (Object, error) { + b, ok := other.(*Range) + if !ok { + return NotImplemented, nil + } + + if a.Length != b.Length { + return False, nil + } + + if a.Length == 0 { + return True, nil + } + if a.Start != b.Start { + return False, nil + } + + if a.Step == 1 { + return True, nil + } + if a.Step != b.Step { + return False, nil + } + + return True, nil +} + +func (a *Range) M__ne__(other Object) (Object, error) { + b, ok := other.(*Range) + if !ok { + return NotImplemented, nil + } + + if a.Length != b.Length { + return True, nil + } + + if a.Length == 0 { + return False, nil + } + if a.Start != b.Start { + return True, nil + } + + if a.Step == 1 { + return False, nil + } + if a.Step != b.Step { + return True, nil + } + + return False, nil +} From 33b1e4055448a546c8a1f139d16f5f7916340633 Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Sat, 21 Sep 2019 03:34:05 +0900 Subject: [PATCH 3/4] Seperate range __repr__ for version constraint strings.Builder is supported since v1.10, so split files for older versions --- py/range.go | 32 -------------------------------- py/range_repr110.go | 38 ++++++++++++++++++++++++++++++++++++++ py/range_repr19.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 py/range_repr110.go create mode 100644 py/range_repr19.go diff --git a/py/range.go b/py/range.go index ad6717dd..31e85963 100644 --- a/py/range.go +++ b/py/range.go @@ -6,10 +6,6 @@ package py -import ( - "strings" -) - // A python Range object // FIXME one day support BigInts too! type Range struct { @@ -112,34 +108,6 @@ func (r *Range) M__str__() (Object, error) { return r.M__repr__() } -func (r *Range) repr() (Object, error) { - var b strings.Builder - b.WriteString("range(") - start, err := ReprAsString(r.Start) - if err != nil { - return nil, err - } - stop, err := ReprAsString(r.Stop) - if err != nil { - return nil, err - } - b.WriteString(start) - b.WriteString(", ") - b.WriteString(stop) - - if r.Step != 1 { - step, err := ReprAsString(r.Step) - if err != nil { - return nil, err - } - b.WriteString(", ") - b.WriteString(step) - } - b.WriteString(")") - - return String(b.String()), nil -} - func (r *Range) M__repr__() (Object, error) { return r.repr() } diff --git a/py/range_repr110.go b/py/range_repr110.go new file mode 100644 index 00000000..2db201d2 --- /dev/null +++ b/py/range_repr110.go @@ -0,0 +1,38 @@ +// Copyright 2018 The go-python Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.10 +// Range object + +package py + +import "strings" + +func (r *Range) repr() (Object, error) { + var b strings.Builder + b.WriteString("range(") + start, err := ReprAsString(r.Start) + if err != nil { + return nil, err + } + stop, err := ReprAsString(r.Stop) + if err != nil { + return nil, err + } + b.WriteString(start) + b.WriteString(", ") + b.WriteString(stop) + + if r.Step != 1 { + step, err := ReprAsString(r.Step) + if err != nil { + return nil, err + } + b.WriteString(", ") + b.WriteString(step) + } + b.WriteString(")") + + return String(b.String()), nil +} \ No newline at end of file diff --git a/py/range_repr19.go b/py/range_repr19.go new file mode 100644 index 00000000..ff527aa6 --- /dev/null +++ b/py/range_repr19.go @@ -0,0 +1,38 @@ +// Copyright 2018 The go-python Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.10 +// Range object + +package py + +import "bytes" + +func (r *Range) repr() (Object, error) { + var b bytes.Buffer + b.WriteString("range(") + start, err := ReprAsString(r.Start) + if err != nil { + return nil, err + } + stop, err := ReprAsString(r.Stop) + if err != nil { + return nil, err + } + b.WriteString(start) + b.WriteString(", ") + b.WriteString(stop) + + if r.Step != 1 { + step, err := ReprAsString(r.Step) + if err != nil { + return nil, err + } + b.WriteString(", ") + b.WriteString(step) + } + b.WriteString(")") + + return String(b.String()), nil +} \ No newline at end of file From d886727280c81db5473294972f820c11d3c8afe3 Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Sat, 21 Sep 2019 03:36:03 +0900 Subject: [PATCH 4/4] Add tests for range object --- py/tests/range.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/py/tests/range.py b/py/tests/range.py index b56e2274..0d3a54fc 100644 --- a/py/tests/range.py +++ b/py/tests/range.py @@ -38,4 +38,42 @@ assert b[-2] == 6 assert b[-1] == 8 +doc="range_eq" +assert range(10) == range(0, 10) +assert not range(10) == 3 +assert range(20) != range(10) +assert range(100, 200, 1) == range(100, 200) +assert range(0, 10, 3) == range(0, 12, 3) +assert range(2000, 100) == range(3, 1) +assert range(0, 10, -3) == range(0, 12, -3) +assert not range(0, 20, 2) == range(0, 20, 4) +try: + range('3', 10) == range(2) +except TypeError: + pass +else: + assert False, "TypeError not raised" + +doc="range_ne" +assert range(10, 0, -3) != range(12, 0, -3) +assert range(10) != 3 +assert not range(100, 200, 1) != range(100, 200) +assert range(0, 10) != range(0, 12) +assert range(0, 10) != range(0, 10, 2) +assert range(0, 20, 2) != range(0, 21, 2) +assert range(0, 20, 2) != range(0, 20, 4) +assert not range(0, 20, 3) != range(0, 20, 3) +try: + range('3', 10) != range(2) +except TypeError: + pass +else: + assert False, "TypeError not raised" + +doc="range_str" +assert str(range(10)) == 'range(0, 10)' +assert str(range(10, 0, 3)) == 'range(10, 0, 3)' +assert str(range(0, 3)) == 'range(0, 3)' +assert str(range(10, 3, -2)) == 'range(10, 3, -2)' + doc="finished"