[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},