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" 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