]> granicus.if.org Git - python/commitdiff
Fix sloppy index() implementation:
authorGuido van Rossum <guido@python.org>
Tue, 17 Jun 2003 14:25:14 +0000 (14:25 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 17 Jun 2003 14:25:14 +0000 (14:25 +0000)
- don't use min() and max()
- interpret negative start/stop argument like negative slice indices

Lib/test/test_types.py
Objects/listobject.c

index 9599456a2212f1bd7407dba5a5300d7e45b73cb0..61f660b6ff9f6566401059f6b59f1d9e7a3e08a9 100644 (file)
@@ -364,18 +364,22 @@ b.insert(-2, "foo")
 b.insert(-200, "left")
 b.insert(200, "right")
 if b != ["left",-2,-1,0,0,"foo",1,2,"right"]: raise TestFailed, 'list insert2'
+# a = [-2,-1,0,0,1,2]
 if a.count(0) != 2: raise TestFailed, ' list count'
 if a.index(0) != 2: raise TestFailed, 'list index'
 if a.index(0,2) != 2: raise TestFailed, 'list index, start argument'
-if a.index(-2,-10) != 0: raise TestFailed, 'list index, negative start argument'
+if a.index(0,-4) != 2: raise TestFailed, 'list index, -start argument'
+if a.index(-2,-10) != 0: raise TestFailed, 'list index, very -start argument'
 if a.index(0,3) != 3: raise TestFailed, 'list index, start argument'
+if a.index(0,-3) != 3: raise TestFailed, 'list index, -start argument'
 if a.index(0,3,4) != 3: raise TestFailed, 'list index, stop argument'
+if a.index(0,-3,-2) != 3: raise TestFailed, 'list index, -stop argument'
 try:
     a.index(2,0,-10)
 except ValueError:
     pass
 else:
-    raise TestFailed, 'list index, negative stop argument'
+    raise TestFailed, 'list index, very -stop argument'
 a.remove(0)
 try:
     a.index(2,0,4)
index 3979006e9ebcf696733d6bb2fa7969c599933d08..a70ac5ffa9a0f04b6a1283cb3b431ff107d668e0 100644 (file)
@@ -1834,8 +1834,18 @@ listindex(PyListObject *self, PyObject *args)
 
        if (!PyArg_ParseTuple(args, "O|ii:index", &v, &start, &stop))
                return NULL;
-       start = max(0, start);
-       stop = max(0, min(self->ob_size, stop));
+       if (start < 0) {
+               start += self->ob_size;
+               if (start < 0)
+                       start = 0;
+       }
+       if (stop < 0) {
+               stop += self->ob_size;
+               if (stop < 0)
+                       stop = 0;
+       }
+       else if (stop > self->ob_size)
+               stop = self->ob_size;
        for (i = start; i < stop; i++) {
                int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
                if (cmp > 0)