Mercurial > cpython-lru_cache-weakref
diff Python/bltinmodule.c @ 46607:7a6d7474ce6e legacy-trunk
#2719: backport next() from 3k.
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Wed, 30 Apr 2008 19:47:09 +0000 |
| parents | 7670005da8c5 |
| children | 4c8375574aa9 |
line wrap: on
line diff
--- a/Python/bltinmodule.c Wed Apr 30 16:19:55 2008 +0000 +++ b/Python/bltinmodule.c Wed Apr 30 19:47:09 2008 +0000 @@ -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},
