# HG changeset patch # User Paul Boddie # Date 1480291181 -3600 # Node ID cc05fadb5fb43d1392612ac93c1992270cd5885d # Parent b22e901e12d6656632525814d76116acf3ee02e2 Introduced proper checking of negative indexes, simplifying index handling. diff -r b22e901e12d6 -r cc05fadb5fb4 lib/__builtins__/list.py --- a/lib/__builtins__/list.py Mon Nov 28 00:53:13 2016 +0100 +++ b/lib/__builtins__/list.py Mon Nov 28 00:59:41 2016 +0100 @@ -107,18 +107,14 @@ "Return the item at the normalised (positive) 'index'." - if index >= len(self): - raise IndexError(index) - + self._check_index(index) return native._list_element(self, index) def __set_single_item__(self, index, value): "Set at the normalised (positive) 'index' the given 'value'." - if index >= len(self): - raise IndexError(index) - + self._check_index(index) return native._list_setelement(self, index, value) # vim: tabstop=4 expandtab shiftwidth=4 diff -r b22e901e12d6 -r cc05fadb5fb4 lib/__builtins__/sequence.py --- a/lib/__builtins__/sequence.py Mon Nov 28 00:53:13 2016 +0100 +++ b/lib/__builtins__/sequence.py Mon Nov 28 00:59:41 2016 +0100 @@ -54,7 +54,7 @@ # ones. if _isinstance(index, int): - index = _normalise_index(index, self.__len__()) + index = _get_absolute_index(index, self.__len__()) return self.__get_single_item__(index) # Handle slices separately. @@ -75,7 +75,7 @@ # ones. if _isinstance(index, int): - index = _normalise_index(index, self.__len__()) + index = _get_absolute_index(index, self.__len__()) return self.__set_single_item__(index, value) # Handle slices separately. @@ -100,7 +100,7 @@ if start is None: start = 0 else: - start = _normalise_index(start, length) + start = _get_absolute_index(start, length) # Handle a null end as the first position after the end of the sequence, # otherwise normalising any end index. @@ -108,7 +108,7 @@ if end is None: end = length else: - end = _normalise_index(end, length) + end = _get_absolute_index(end, length) result = [] @@ -118,6 +118,16 @@ return result + def _check_index(self, index): + + """ + Check the given absolute 'index', raising an IndexError if out of + bounds. + """ + + if index < 0 or index >= len(self): + raise IndexError(index) + def _get_absolute_index(index, length): """ @@ -130,12 +140,6 @@ else: return index -def _normalise_index(index, length): - - "Normalise 'index' for a collection having the specified 'length'." - - return _min(length, _max(0, _get_absolute_index(index, length))) - def _max(x, y): "Return the maximum of 'x' and 'y'." diff -r b22e901e12d6 -r cc05fadb5fb4 lib/__builtins__/tuple.py --- a/lib/__builtins__/tuple.py Mon Nov 28 00:53:13 2016 +0100 +++ b/lib/__builtins__/tuple.py Mon Nov 28 00:59:41 2016 +0100 @@ -86,9 +86,7 @@ "Return the item at the normalised (positive) 'index'." - if index >= len(self): - raise IndexError(index) - + self._check_index(index) return native._list_element(self, index) def __set_single_item__(self, index, value):