1.1 --- a/lib/__builtins__/sequence.py Mon Dec 12 01:46:28 2016 +0100
1.2 +++ b/lib/__builtins__/sequence.py Mon Dec 12 17:05:59 2016 +0100
1.3 @@ -35,6 +35,16 @@
1.4 if index < 0 or index >= len(self):
1.5 raise IndexError(index)
1.6
1.7 + def _check_end_index(self, index):
1.8 +
1.9 + """
1.10 + Check the given absolute end 'index', raising an IndexError if out of
1.11 + bounds.
1.12 + """
1.13 +
1.14 + if index < -1 or index > len(self):
1.15 + raise IndexError(index)
1.16 +
1.17 def __getitem__(self, index):
1.18
1.19 "Return the item or slice specified by 'index'."
1.20 @@ -112,13 +122,7 @@
1.21 else:
1.22 end = _get_absolute_index(end, length)
1.23
1.24 - result = []
1.25 -
1.26 - while step > 0 and start < end or step < 0 and start > end:
1.27 - result.append(self.__get_single_item__(start))
1.28 - start += step
1.29 -
1.30 - return result
1.31 + return self.__get_multiple_items__(start, end, step)
1.32
1.33 # Methods implemented by subclasses.
1.34
1.35 @@ -140,6 +144,12 @@
1.36
1.37 pass
1.38
1.39 + def __get_multiple_items__(self, start, end, step):
1.40 +
1.41 + "Method to be overridden by subclasses."
1.42 +
1.43 + return None
1.44 +
1.45 def __len__(self):
1.46
1.47 "Method to be overridden by subclasses."
1.48 @@ -230,6 +240,21 @@
1.49
1.50 raise StopIteration()
1.51
1.52 + def __get_multiple_items__(self, start, end, step):
1.53 +
1.54 + """
1.55 + Return items from 'start' until (but excluding) 'end', at 'step'
1.56 + intervals.
1.57 + """
1.58 +
1.59 + result = []
1.60 +
1.61 + while step > 0 and start < end or step < 0 and start > end:
1.62 + result.append(self.__get_single_item__(start))
1.63 + start += step
1.64 +
1.65 + return result
1.66 +
1.67 def _get_absolute_index(index, length):
1.68
1.69 """