SF #754014: list.index() should accept optional start, end arguments
Also, modified UserList.index() to match and expanded the related tests.
This commit is contained in:
parent
c8106e1f1d
commit
d05abdec7b
|
@ -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):
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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[:]
|
||||
|
|
|
@ -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).
|
||||
|
||||
|
|
|
@ -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},
|
||||
|
|
Loading…
Reference in New Issue