]> granicus.if.org Git - python/commitdiff
#2719: backport next() from 3k.
authorGeorg Brandl <georg@python.org>
Wed, 30 Apr 2008 19:47:09 +0000 (19:47 +0000)
committerGeorg Brandl <georg@python.org>
Wed, 30 Apr 2008 19:47:09 +0000 (19:47 +0000)
Doc/library/functions.rst
Lib/test/test_builtin.py
Misc/NEWS
Python/bltinmodule.c

index 4ec03c847713ac28fb1d8b9acee0cf47481794b6..a1fd62784efb6c2ec205791678d25e8dec403725 100644 (file)
@@ -710,6 +710,15 @@ available.  They are listed here in alphabetical order.
       Added support for the optional *key* argument.
 
 
+.. function:: next(iterator[, default])
+
+   Retrieve the next item from the *iterator* by calling its :meth:`next`
+   method.  If *default* is given, it is returned if the iterator is exhausted,
+   otherwise :exc:`StopIteration` is raised.
+
+   .. versionadded:: 2.6
+
+
 .. function:: object()
 
    Return a new featureless object.  :class:`object` is a base for all new style
index 9fa973ea026a21327140886192053ecc514b39e6..dbc86e281aa855660db361f9b63bbc7a7d47e0ae 100644 (file)
@@ -1539,6 +1539,33 @@ class BuiltinTest(unittest.TestCase):
         self.assertEqual(min(data, key=f),
                          sorted(data, key=f)[0])
 
+    def test_next(self):
+        it = iter(range(2))
+        self.assertEqual(next(it), 0)
+        self.assertEqual(next(it), 1)
+        self.assertRaises(StopIteration, next, it)
+        self.assertRaises(StopIteration, next, it)
+        self.assertEquals(next(it, 42), 42)
+
+        class Iter(object):
+            def __iter__(self):
+                return self
+            def next(self):
+                raise StopIteration
+
+        it = iter(Iter())
+        self.assertEquals(next(it, 42), 42)
+        self.assertRaises(StopIteration, next, it)
+
+        def gen():
+            yield 1
+            return
+
+        it = gen()
+        self.assertEquals(next(it), 1)
+        self.assertRaises(StopIteration, next, it)
+        self.assertEquals(next(it, 42), 42)
+
     def test_oct(self):
         self.assertEqual(oct(100), '0144')
         self.assertEqual(oct(100L), '0144L')
index 501a164332a004c2d5937d02711337c76765c141..34bdb9dfe91801741fd79cb3982a426b917d51cc 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.6 alpha 3?
 Core and builtins
 -----------------
 
+- Issue #2719: backported the ``next()`` builtin from Python 3.
+
 - Issue #2681: The octal literal ``0o8`` was incorrecly acctepted. Now it
   properly raises a SyntaxError.
 
index 9f9b75a7372c3beef59053f70e1def5f14306a36..02a2faae3cdaa8bafd7a582f752a9edbc3b273ee 100644 (file)
@@ -1070,6 +1070,47 @@ sequences have the same length.  If the function is None, return a list of\n\
 the items of the sequence (or a list of tuples if more than one sequence).");
 
 
+static PyObject *
+builtin_next(PyObject *self, PyObject *args)
+{
+       PyObject *it, *res;
+       PyObject *def = NULL;
+
+       if (!PyArg_UnpackTuple(args, "next", 1, 2, &it, &def))
+               return NULL;
+       if (!PyIter_Check(it)) {
+               PyErr_Format(PyExc_TypeError,
+                       "%.200s object is not an iterator",
+                       it->ob_type->tp_name);
+               return NULL;
+       }
+       
+       res = (*it->ob_type->tp_iternext)(it);
+       if (res != NULL) {
+               return res;
+       } else if (def != NULL) {
+               if (PyErr_Occurred()) {
+                       if (!PyErr_ExceptionMatches(PyExc_StopIteration))
+                               return NULL;
+                       PyErr_Clear();
+               }
+               Py_INCREF(def);
+               return def;
+       } else if (PyErr_Occurred()) {
+               return NULL;
+       } else {
+               PyErr_SetNone(PyExc_StopIteration);
+               return NULL;
+       }
+}
+
+PyDoc_STRVAR(next_doc,
+"next(iterator[, default])\n\
+\n\
+Return the next item from the iterator. If default is given and the iterator\n\
+is exhausted, it is returned instead of raising StopIteration.");
+
+
 static PyObject *
 builtin_setattr(PyObject *self, PyObject *args)
 {
@@ -2509,6 +2550,7 @@ static PyMethodDef builtin_methods[] = {
        {"map",         builtin_map,        METH_VARARGS, map_doc},
        {"max",         (PyCFunction)builtin_max,        METH_VARARGS | METH_KEYWORDS, max_doc},
        {"min",         (PyCFunction)builtin_min,        METH_VARARGS | METH_KEYWORDS, min_doc},
+       {"next",        builtin_next,       METH_VARARGS, next_doc},
        {"oct",         builtin_oct,        METH_O, oct_doc},
        {"open",        (PyCFunction)builtin_open,       METH_VARARGS | METH_KEYWORDS, open_doc},
        {"ord",         builtin_ord,        METH_O, ord_doc},