Index: Objects/enumobject.c =================================================================== --- Objects/enumobject.c (revision 63147) +++ Objects/enumobject.c (working copy) @@ -15,8 +15,16 @@ { enumobject *en; PyObject *seq = NULL; + PyObject *start = NULL; static char *kwlist[] = {"sequence", 0}; + if (kwds) { + start = PyDict_GetItemString(kwds, "start"); + if (start) { + Py_INCREF(start); + PyDict_DelItemString(kwds, "start"); + } + } if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:enumerate", kwlist, &seq)) return NULL; @@ -24,9 +32,25 @@ en = (enumobject *)type->tp_alloc(type, 0); if (en == NULL) return NULL; - en->en_index = 0; + if (start) { + if (PyInt_Check(start)) { + en->en_index = PyInt_AsLong(start); + en->en_longindex = NULL; + Py_DECREF(start); + } else if (PyLong_Check(start)) { + en->en_index = LONG_MAX; + en->en_longindex = start; + } else { + PyErr_SetString(PyExc_TypeError, + "start value must be numeric"); + Py_DECREF(start); + return NULL; + } + } else { + en->en_index = 0; + en->en_longindex = NULL; + } en->en_sit = PyObject_GetIter(seq); - en->en_longindex = NULL; if (en->en_sit == NULL) { Py_DECREF(en); return NULL; Index: Lib/test/test_enumerate.py =================================================================== --- Lib/test/test_enumerate.py (revision 63147) +++ Lib/test/test_enumerate.py (working copy) @@ -195,7 +195,23 @@ self.fail("non-callable __reversed__ didn't raise!") self.assertEqual(rc, sys.getrefcount(r)) +class TestStart(EnumerateTestCase): + + enum = lambda i: enumerate(i, start=10) + seq, res = 'abc', [(10,'a'), (11,'b'), (12,'c')] +class TestLongStart(EnumerateTestCase): + + enum = lambda i: enumerate(i, start=sys.maxint+1) + seq, res = 'abc', [(sys.maxint+1,'a'), (sys.maxint+2,'b'), + (sys.maxint+3,'c')] + +class EnumerateTestCase(unittest.TestCase): + + enum = enumerate + seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')] + + def test_main(verbose=None): testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig, TestReversed)