[Python-checkins] r63208 - in python/trunk: Doc/library/functions.rst Lib/test/test_enumerate.py Objects/enumobject.c
georg.brandl
python-checkins at python.org
Tue May 13 21:04:55 CEST 2008
Author: georg.brandl
Date: Tue May 13 21:04:54 2008
New Revision: 63208
Log:
#2831: add start argument to enumerate(). Patch by Scott Dial and me.
Modified:
python/trunk/Doc/library/functions.rst
python/trunk/Lib/test/test_enumerate.py
python/trunk/Objects/enumobject.c
Modified: python/trunk/Doc/library/functions.rst
==============================================================================
--- python/trunk/Doc/library/functions.rst (original)
+++ python/trunk/Doc/library/functions.rst Tue May 13 21:04:54 2008
@@ -335,15 +335,15 @@
Using :func:`divmod` with complex numbers is deprecated.
-.. function:: enumerate(sequence)
+.. function:: enumerate(sequence[, start=0])
Return an enumerate object. *sequence* must be a sequence, an
:term:`iterator`, or some other object which supports iteration. The
:meth:`next` method of the iterator returned by :func:`enumerate` returns a
- tuple containing a count (from zero) and the corresponding value obtained
- from iterating over *iterable*. :func:`enumerate` is useful for obtaining an
- indexed series: ``(0, seq[0])``, ``(1, seq[1])``, ``(2, seq[2])``, .... For
- example:
+ tuple containing a count (from *start* which defaults to 0) and the
+ corresponding value obtained from iterating over *iterable*.
+ :func:`enumerate` is useful for obtaining an indexed series: ``(0, seq[0])``,
+ ``(1, seq[1])``, ``(2, seq[2])``, .... For example:
>>> for i, season in enumerate(['Spring', 'Summer', 'Fall', 'Winter']):
... print i, season
@@ -353,6 +353,8 @@
3 Winter
.. versionadded:: 2.3
+ .. versionadded:: 2.6
+ The *start* parameter.
.. function:: eval(expression[, globals[, locals]])
Modified: python/trunk/Lib/test/test_enumerate.py
==============================================================================
--- python/trunk/Lib/test/test_enumerate.py (original)
+++ python/trunk/Lib/test/test_enumerate.py Tue May 13 21:04:54 2008
@@ -100,7 +100,8 @@
def test_argumentcheck(self):
self.assertRaises(TypeError, self.enum) # no arguments
self.assertRaises(TypeError, self.enum, 1) # wrong type (not iterable)
- self.assertRaises(TypeError, self.enum, 'abc', 2) # too many arguments
+ self.assertRaises(TypeError, self.enum, 'abc', 'a') # wrong type
+ self.assertRaises(TypeError, self.enum, 'abc', 2, 3) # too many arguments
def test_tuple_reuse(self):
# Tests an implementation detail where tuple is reused
@@ -196,6 +197,19 @@
self.assertEqual(rc, sys.getrefcount(r))
+class TestStart(EnumerateTestCase):
+
+ enum = lambda i: enumerate(i, start=11)
+ seq, res = 'abc', [(1, 'a'), (2, 'b'), (3, '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')]
+
+
def test_main(verbose=None):
testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,
TestReversed)
Modified: python/trunk/Objects/enumobject.c
==============================================================================
--- python/trunk/Objects/enumobject.c (original)
+++ python/trunk/Objects/enumobject.c Tue May 13 21:04:54 2008
@@ -15,18 +15,36 @@
{
enumobject *en;
PyObject *seq = NULL;
- static char *kwlist[] = {"sequence", 0};
+ PyObject *start = NULL;
+ static char *kwlist[] = {"sequence", "start", 0};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:enumerate", kwlist,
- &seq))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist,
+ &seq, &start))
return NULL;
en = (enumobject *)type->tp_alloc(type, 0);
if (en == NULL)
return NULL;
- en->en_index = 0;
+ if (start) {
+ start = PyNumber_Index(start);
+ if (start == NULL) {
+ Py_DECREF(en);
+ return NULL;
+ }
+ if (PyLong_Check(start)) {
+ en->en_index = LONG_MAX;
+ en->en_longindex = start;
+ } else {
+ assert(PyInt_Check(start));
+ en->en_index = PyInt_AsLong(start);
+ en->en_longindex = NULL;
+ Py_DECREF(start);
+ }
+ } 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;
More information about the Python-checkins
mailing list