Skip to content

Commit aee393c

Browse files
committed
-
1 parent c9c1d7d commit aee393c

File tree

1 file changed

+21
-12
lines changed
  • source_py3/python_toolbox/sequence_tools

1 file changed

+21
-12
lines changed

source_py3/python_toolbox/sequence_tools/range.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import collections
55
import numbers
66

7+
from python_toolbox import caching
8+
79
infinity = float('inf')
810
infinities = (infinity, -infinity)
9-
1011
NoneType = type(None)
1112

13+
1214
def parse_range_args(*args):
1315
assert 0 <= len(args) <= 3
1416

@@ -89,15 +91,18 @@ def __init__(self, *args):
8991
__eq__ = lambda self, other: (isinstance(other, Range) and
9092
(self._reduced == other._reduced))
9193

94+
distance_to_cover = caching.CachedProperty(lambda self:
95+
self.stop - self.start)
96+
9297
@caching.CachedProperty
9398
def length(self):
9499
from python_toolbox import math_tools
95-
distance_to_cover = self.stop - self.start
96-
if math_tools.get_sign(distance_to_cover) != \
100+
101+
if math_tools.get_sign(self.distance_to_cover) != \
97102
math_tools.get_sign(self.step):
98103
return 0
99104
else:
100-
raw_length, remainder = divmod(distance_to_cover, self.step)
105+
raw_length, remainder = divmod(self.distance_to_cover, self.step)
101106
raw_length += (remainder != 0)
102107
return raw_length
103108

@@ -130,18 +135,22 @@ def __len__(self):
130135
return self.length if (self.length not in infinities) else 0
131136

132137
def __contains__(self, i):
138+
try: self.index(i)
139+
except ValueError: return False
140+
else: return True
133141

134-
if not isinstance(i, numbers.Number):
135-
return False
136-
137-
138-
__contains__ = lambda self, i: (isinstance(i, numbers.Integral) and
139-
i >= self.start)
140142
def index(self, i):
141-
if not isinstance(i, numbers.Integral) or not i >= self.start:
143+
if not isinstance(i, numbers.Number):
142144
raise ValueError
143145
else:
144-
return i - self.start
146+
distance = i - self.start
147+
if math_tools.get_sign(distance) != math_tools.get_sign(self.step):
148+
raise ValueError
149+
index, remainder = divmod(distance, self.step)
150+
if remainder == 0:
151+
return index
152+
else:
153+
raise ValueError
145154

146155

147156
Range.register(range)

0 commit comments

Comments
 (0)