Guido van Rossum schrieb:
Having now read this entire thread I am going to accept Ping's PEP.
Adding the sentinel argument to the next() builtin was what did it for
me: it neatly solves the problem if having to catch that StopIteration
in 99% of the cases.

Attached is a possible implementation for the next() function, regardless
of how the next method is going to be called in the future.

Georg

Index: Python/bltinmodule.c
===================================================================
--- Python/bltinmodule.c        (Revision 54016)
+++ Python/bltinmodule.c        (Arbeitskopie)
@@ -1029,6 +1029,45 @@
 
 
 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) {
+               if (def) {
+                       if (PyErr_Occurred() &&
+                           !PyErr_ExceptionMatches(PyExc_StopIteration))
+                               return NULL;
+                       Py_INCREF(def);
+                       return def;
+               } else if (PyErr_Occurred()) {
+                       return NULL;
+               } else {
+                       PyErr_SetNone(PyExc_StopIteration);
+                       return NULL;
+               }
+       }
+       return res;
+}
+
+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;
@@ -2132,6 +2171,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",        (PyCFunction)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},
_______________________________________________
Python-3000 mailing list
Python-3000@python.org
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to