Mercurial > cpython-lru_cache-weakref
diff Modules/arraymodule.c @ 31660:35f56e08727f legacy-trunk
SF feature request #686323: Minor array module enhancements
array.extend() now accepts iterable arguments implements as a series
of appends. Besides being a user convenience and matching the behavior
for lists, this the saves memory and cycles that would be used to
create a temporary array object.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Sun, 14 Mar 2004 05:43:59 +0000 |
| parents | 206d8575f644 |
| children | 2c169ca5fa69 |
line wrap: on
line diff
--- a/Modules/arraymodule.c Sun Mar 14 04:37:50 2004 +0000 +++ b/Modules/arraymodule.c Sun Mar 14 05:43:59 2004 +0000 @@ -775,16 +775,35 @@ } static int +array_iter_extend(arrayobject *self, PyObject *bb) +{ + PyObject *it, *v; + + it = PyObject_GetIter(bb); + if (it == NULL) + return -1; + + while ((v = PyIter_Next(it)) != NULL) { + if (ins1(self, (int) self->ob_size, v) != 0) { + Py_DECREF(v); + Py_DECREF(it); + return -1; + } + Py_DECREF(v); + } + Py_DECREF(it); + if (PyErr_Occurred()) + return -1; + return 0; +} + +static int array_do_extend(arrayobject *self, PyObject *bb) { int size; - if (!array_Check(bb)) { - PyErr_Format(PyExc_TypeError, - "can only extend array with array (not \"%.200s\")", - bb->ob_type->tp_name); - return -1; - } + if (!array_Check(bb)) + return array_iter_extend(self, bb); #define b ((arrayobject *)bb) if (self->ob_descr != b->ob_descr) { PyErr_SetString(PyExc_TypeError, @@ -810,6 +829,12 @@ static PyObject * array_inplace_concat(arrayobject *self, PyObject *bb) { + if (!array_Check(bb)) { + PyErr_Format(PyExc_TypeError, + "can only extend array with array (not \"%.200s\")", + bb->ob_type->tp_name); + return NULL; + } if (array_do_extend(self, bb) == -1) return NULL; Py_INCREF(self); @@ -990,9 +1015,9 @@ } PyDoc_STRVAR(extend_doc, -"extend(array)\n\ +"extend(array or iterable)\n\ \n\ - Append array items to the end of the array."); + Append items to the end of the array."); static PyObject * array_insert(arrayobject *self, PyObject *args) @@ -1881,7 +1906,7 @@ buffer_info() -- return information giving the current memory info\n\ byteswap() -- byteswap all the items of the array\n\ count() -- return number of occurences of an object\n\ -extend() -- extend array by appending array elements\n\ +extend() -- extend array by appending multiple elements from an iterable\n\ fromfile() -- read items from a file object\n\ fromlist() -- append items from the list\n\ fromstring() -- append items from the string\n\
