[Python-checkins] r65802 - python/trunk/Python/bltinmodule.c

benjamin.peterson python-checkins at python.org
Mon Aug 18 04:01:21 CEST 2008


Author: benjamin.peterson
Date: Mon Aug 18 04:01:21 2008
New Revision: 65802

Log:
follup to #3473: don't duplicate the reduce code

Modified:
   python/trunk/Python/bltinmodule.c

Modified: python/trunk/Python/bltinmodule.c
==============================================================================
--- python/trunk/Python/bltinmodule.c	(original)
+++ python/trunk/Python/bltinmodule.c	Mon Aug 18 04:01:21 2008
@@ -2001,68 +2001,22 @@
 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,


More information about the Python-checkins mailing list