[Python-checkins] r62599 - in python/trunk: Doc/library/functions.rst Lib/test/test_builtin.py Misc/NEWS Python/bltinmodule.c
georg.brandl
python-checkins at python.org
Wed Apr 30 21:47:09 CEST 2008
Author: georg.brandl
Date: Wed Apr 30 21:47:09 2008
New Revision: 62599
Log:
#2719: backport next() from 3k.
Modified:
python/trunk/Doc/library/functions.rst
python/trunk/Lib/test/test_builtin.py
python/trunk/Misc/NEWS
python/trunk/Python/bltinmodule.c
Modified: python/trunk/Doc/library/functions.rst
==============================================================================
--- python/trunk/Doc/library/functions.rst (original)
+++ python/trunk/Doc/library/functions.rst Wed Apr 30 21:47:09 2008
@@ -710,6 +710,15 @@
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
Modified: python/trunk/Lib/test/test_builtin.py
==============================================================================
--- python/trunk/Lib/test/test_builtin.py (original)
+++ python/trunk/Lib/test/test_builtin.py Wed Apr 30 21:47:09 2008
@@ -1539,6 +1539,33 @@
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')
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Wed Apr 30 21:47:09 2008
@@ -12,6 +12,8 @@
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.
Modified: python/trunk/Python/bltinmodule.c
==============================================================================
--- python/trunk/Python/bltinmodule.c (original)
+++ python/trunk/Python/bltinmodule.c Wed Apr 30 21:47:09 2008
@@ -1071,6 +1071,47 @@
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)
{
PyObject *v;
@@ -2509,6 +2550,7 @@
{"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},
More information about the Python-checkins
mailing list