Issue #3004: Minor fix to slice.indices(). slice(-10).indices(9) now
authorMark Dickinson <dickinsm@gmail.com>
Fri, 20 Jun 2008 14:53:43 +0000 (14:53 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Fri, 20 Jun 2008 14:53:43 +0000 (14:53 +0000)
returns (0, 0, 1) instead of (0, -1, 1), and slice(None, 10, -1).indices(10)
returns (9, 9, -1) instead of (9, 10, -1).

Lib/test/test_slice.py
Misc/NEWS
Objects/sliceobject.c

index 83f051f688894b50ce9110f437fd691c7f8051b1..8c90c10e846180bca45a7c2f780373c0c13249f6 100644 (file)
@@ -79,6 +79,20 @@ class SliceTest(unittest.TestCase):
         self.assertEqual(slice(None,  None, -1).indices(10), (9, -1, -1))
         self.assertEqual(slice(None,  None, -2).indices(10), (9, -1, -2))
         self.assertEqual(slice(3,     None, -2).indices(10), (3, -1, -2))
+        # issue 3004 tests
+        self.assertEqual(slice(None, -9).indices(10), (0, 1, 1))
+        self.assertEqual(slice(None, -10).indices(10), (0, 0, 1))
+        self.assertEqual(slice(None, -11).indices(10), (0, 0, 1))
+        self.assertEqual(slice(None, -10, -1).indices(10), (9, 0, -1))
+        self.assertEqual(slice(None, -11, -1).indices(10), (9, -1, -1))
+        self.assertEqual(slice(None, -12, -1).indices(10), (9, -1, -1))
+        self.assertEqual(slice(None, 9).indices(10), (0, 9, 1))
+        self.assertEqual(slice(None, 10).indices(10), (0, 10, 1))
+        self.assertEqual(slice(None, 11).indices(10), (0, 10, 1))
+        self.assertEqual(slice(None, 8, -1).indices(10), (9, 8, -1))
+        self.assertEqual(slice(None, 9, -1).indices(10), (9, 9, -1))
+        self.assertEqual(slice(None, 10, -1).indices(10), (9, 9, -1))
+
         self.assertEqual(
             slice(-100,  100     ).indices(10),
             slice(None).indices(10)
index 9e02d763b86d29d0cf12e6500d854e98f3bb3f57..96d45af08809ade480ecb3a6c8a668cb6ca44871 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,13 @@ What's New in Python 2.6 beta 2?
 Core and Builtins
 -----------------
 
+- Issue #3004: Minor change to slice.indices(): the start and stop
+  arguments are now treated identically, making the behaviour easier
+  to describe and understand.  For example, slice(None, -10,
+  1).indices(9) now returns (0, 0, 1) instead of (0, -1, 1), and
+  slice(None, 10, -1).indices(10) returns (9, 9, -1) instead of (9,
+  10, -1).
+
 - Make bin() implementation parallel oct() and hex().
 
 
index 075418ebccde39969fb90ff904da43a0ff17f14e..8748fed4ce58a9a9256e5b46d98840523fe83f34 100644 (file)
@@ -169,8 +169,9 @@ PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length,
        else {
                if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
                if (*stop < 0) *stop += length;
-               if (*stop < 0) *stop = -1;
-               if (*stop > length) *stop = length;
+               if (*stop < 0) *stop = (*step < 0) ? -1 : 0;
+               if (*stop >= length)
+                       *stop = (*step < 0) ? length - 1 : length;
        }
 
        if ((*step < 0 && *stop >= *start)