]> granicus.if.org Git - python/commitdiff
follup to #3473: don't duplicate the reduce code
authorBenjamin Peterson <benjamin@python.org>
Mon, 18 Aug 2008 02:01:21 +0000 (02:01 +0000)
committerBenjamin Peterson <benjamin@python.org>
Mon, 18 Aug 2008 02:01:21 +0000 (02:01 +0000)
Python/bltinmodule.c

index 4a1ffd50f918ea05d08605f905067a099626136b..4e6f901ab34a8b20ef8df6c347fe42e14d6387dc 100644 (file)
@@ -2001,68 +2001,22 @@ is printed without a trailing newline before reading.");
 static PyObject *
 builtin_reduce(PyObject *self, PyObject *args)
 {
-       PyObject *seq, *func, *result = NULL, *it;
+       static PyObject *functools_reduce = NULL;
 
        if (PyErr_WarnPy3k("reduce() not supported in 3.x; "
                           "use functools.reduce()", 1) < 0)
                return NULL;
 
-       if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))
-               return NULL;
-       if (result != NULL)
-               Py_INCREF(result);
-
-       it = PyObject_GetIter(seq);
-       if (it == NULL) {
-               PyErr_SetString(PyExc_TypeError,
-                   "reduce() arg 2 must support iteration");
-               Py_XDECREF(result);
-               return NULL;
-       }
-
-       if ((args = PyTuple_New(2)) == NULL)
-               goto Fail;
-
-       for (;;) {
-               PyObject *op2;
-
-               if (args->ob_refcnt > 1) {
-                       Py_DECREF(args);
-                       if ((args = PyTuple_New(2)) == NULL)
-                               goto Fail;
-               }
-
-               op2 = PyIter_Next(it);
-               if (op2 == NULL) {
-                       if (PyErr_Occurred())
-                               goto Fail;
-                       break;
-               }
-
-               if (result == NULL)
-                       result = op2;
-               else {
-                       PyTuple_SetItem(args, 0, result);
-                       PyTuple_SetItem(args, 1, op2);
-                       if ((result = PyEval_CallObject(func, args)) == NULL)
-                               goto Fail;
-               }
+       if (functools_reduce == NULL) {
+               PyObject *functools = PyImport_ImportModule("functools");
+               if (functools == NULL)
+                       return NULL;
+               functools_reduce = PyObject_GetAttrString(functools, "reduce");
+               Py_DECREF(functools);
+               if (functools_reduce == NULL)
+                       return NULL;
        }
-
-       Py_DECREF(args);
-
-       if (result == NULL)
-               PyErr_SetString(PyExc_TypeError,
-                          "reduce() of empty sequence with no initial value");
-
-       Py_DECREF(it);
-       return result;
-
-Fail:
-       Py_XDECREF(args);
-       Py_XDECREF(result);
-       Py_DECREF(it);
-       return NULL;
+       return PyObject_Call(functools_reduce, args, NULL);
 }
 
 PyDoc_STRVAR(reduce_doc,