From d05abdec7b2620449369bb44a617684463ba50ac Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 17 Jun 2003 05:05:49 +0000 Subject: SF #754014: list.index() should accept optional start, end arguments Also, modified UserList.index() to match and expanded the related tests. --- Lib/UserList.py | 2 +- Lib/test/test_types.py | 16 ++++++++++++++++ Lib/test/test_userlist.py | 9 +++++++++ Misc/NEWS | 3 +++ Objects/listobject.c | 15 ++++++++++----- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Lib/UserList.py b/Lib/UserList.py index 76cf31f..dd1b927 100644 --- a/Lib/UserList.py +++ b/Lib/UserList.py @@ -75,7 +75,7 @@ class UserList: def pop(self, i=-1): return self.data.pop(i) def remove(self, item): self.data.remove(item) def count(self, item): return self.data.count(item) - def index(self, item): return self.data.index(item) + def index(self, item, *args): return self.data.index(item, *args) def reverse(self): self.data.reverse() def sort(self, *args): self.data.sort(*args) def extend(self, other): diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 1cb1484..9599456 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -366,7 +366,23 @@ b.insert(200, "right") if b != ["left",-2,-1,0,0,"foo",1,2,"right"]: raise TestFailed, 'list insert2' 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,3) != 3: raise TestFailed, 'list index, start argument' +if a.index(0,3,4) != 3: raise TestFailed, 'list index, stop argument' +try: + a.index(2,0,-10) +except ValueError: + pass +else: + raise TestFailed, 'list index, negative stop argument' a.remove(0) +try: + a.index(2,0,4) +except ValueError: + pass +else: + raise TestFailed, 'list index, stop argument.' if a != [-2,-1,0,1,2]: raise TestFailed, 'list remove' a.reverse() if a != [2,1,0,-1,-2]: raise TestFailed, 'list reverse' diff --git a/Lib/test/test_userlist.py b/Lib/test/test_userlist.py index 467a47c..2d11a24 100644 --- a/Lib/test/test_userlist.py +++ b/Lib/test/test_userlist.py @@ -206,6 +206,15 @@ class UserListTest(unittest.TestCase): self.assertEqual(u.index(1), 1) self.assertRaises(ValueError, u.index, 2) + u = UserList([-2,-1,0,0,1,2]) + self.assertEqual(u.count(0), 2) + self.assertEqual(u.index(0), 2) + self.assertEqual(u.index(0,2), 2) + self.assertEqual(u.index(-2,-10), 0) + self.assertEqual(u.index(0,3), 3) + self.assertEqual(u.index(0,3,4), 3) + self.assertRaises(ValueError, u.index, 2,0,-10) + def test_reverse(self): u = UserList((0, 1)) u2 = u[:] diff --git a/Misc/NEWS b/Misc/NEWS index 0ee2046..b8b9a9b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.3 beta 2? Core and builtins ----------------- +- list.index() now accepts optional start and stop arguments. Similar + changes were made to UserList.index(). SF feature request 754014. + - SF patch 751998 fixes an unwanted side effect of the previous fix for SF bug 742860 (the next item). diff --git a/Objects/listobject.c b/Objects/listobject.c index 7d03506..3979006 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1827,11 +1827,16 @@ PyList_AsTuple(PyObject *v) } static PyObject * -listindex(PyListObject *self, PyObject *v) +listindex(PyListObject *self, PyObject *args) { - int i; + int i, start=0, stop=self->ob_size; + PyObject *v; - for (i = 0; i < self->ob_size; i++) { + if (!PyArg_ParseTuple(args, "O|ii:index", &v, &start, &stop)) + return NULL; + start = max(0, start); + stop = max(0, min(self->ob_size, stop)); + for (i = start; i < stop; i++) { int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); if (cmp > 0) return PyInt_FromLong((long)i); @@ -2088,7 +2093,7 @@ PyDoc_STRVAR(pop_doc, PyDoc_STRVAR(remove_doc, "L.remove(value) -- remove first occurrence of value"); PyDoc_STRVAR(index_doc, -"L.index(value) -> integer -- return index of first occurrence of value"); +"L.index(value, [start, [stop]]) -> integer -- return first index of value"); PyDoc_STRVAR(count_doc, "L.count(value) -> integer -- return number of occurrences of value"); PyDoc_STRVAR(reverse_doc, @@ -2102,7 +2107,7 @@ static PyMethodDef list_methods[] = { {"extend", (PyCFunction)listextend, METH_O, extend_doc}, {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc}, {"remove", (PyCFunction)listremove, METH_O, remove_doc}, - {"index", (PyCFunction)listindex, METH_O, index_doc}, + {"index", (PyCFunction)listindex, METH_VARARGS, index_doc}, {"count", (PyCFunction)listcount, METH_O, count_doc}, {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc}, {"sort", (PyCFunction)listsort, METH_VARARGS, sort_doc}, -- cgit v0.12