[Python-checkins] python/dist/src/Python bltinmodule.c,2.288,2.289
aleax@users.sourceforge.net
aleax@users.sourceforge.net
Tue, 22 Apr 2003 01:12:36 -0700
Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1:/tmp/cvs-serv22004/src/Python
Modified Files:
bltinmodule.c
Log Message:
Adding new built-in function sum, with docs and tests.
Index: bltinmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/bltinmodule.c,v
retrieving revision 2.288
retrieving revision 2.289
diff -C2 -d -r2.288 -r2.289
*** bltinmodule.c 15 Apr 2003 12:43:26 -0000 2.288
--- bltinmodule.c 22 Apr 2003 08:12:33 -0000 2.289
***************
*** 1799,1802 ****
--- 1799,1862 ----
With an argument, equivalent to object.__dict__.");
+
+ static PyObject*
+ builtin_sum(PyObject *self, PyObject *args)
+ {
+ PyObject *seq;
+ PyObject *result = NULL;
+ PyObject *temp, *item, *iter;
+
+ if (!PyArg_ParseTuple(args, "O|O:sum", &seq, &result))
+ return NULL;
+
+ iter = PyObject_GetIter(seq);
+ if (iter == NULL)
+ return NULL;
+
+ if (result == NULL) {
+ result = PyInt_FromLong(0);
+ if (result == NULL) {
+ Py_DECREF(iter);
+ return NULL;
+ }
+ } else {
+ /* reject string values for 'start' parameter */
+ if (PyObject_TypeCheck(result, &PyBaseString_Type)) {
+ PyErr_SetString(PyExc_TypeError,
+ "can't sum strings [use ''.join(seq) instead]");
+ Py_DECREF(result);
+ Py_DECREF(iter);
+ return NULL;
+ }
+ }
+
+ for(;;) {
+ item = PyIter_Next(iter);
+ if (item == NULL) {
+ /* error, or end-of-sequence */
+ if (PyErr_Occurred()) {
+ Py_DECREF(result);
+ result = NULL;
+ }
+ break;
+ }
+ temp = PyNumber_Add(result, item);
+ Py_DECREF(result);
+ Py_DECREF(item);
+ result = temp;
+ if (result == NULL)
+ break;
+ }
+ Py_DECREF(iter);
+ return result;
+ }
+
+ PyDoc_STRVAR(sum_doc,
+ "sum(sequence, start=0) -> value\n\
+ \n\
+ Returns the sum of a sequence of numbers (NOT strings) plus the value\n\
+ of parameter 'start'. When the sequence is empty, returns start.");
+
+
static PyObject *
builtin_isinstance(PyObject *self, PyObject *args)
***************
*** 2002,2005 ****
--- 2062,2066 ----
{"round", builtin_round, METH_VARARGS, round_doc},
{"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
+ {"sum", builtin_sum, METH_VARARGS, sum_doc},
#ifdef Py_USING_UNICODE
{"unichr", builtin_unichr, METH_VARARGS, unichr_doc},