44import collections
55import numbers
66
7+ from python_toolbox import caching
8+
79infinity = float ('inf' )
810infinities = (infinity , - infinity )
9-
1011NoneType = type (None )
1112
13+
1214def 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
147156Range .register (range )
0 commit comments