diff options
author | Raymond Hettinger <python@rcn.com> | 2004-03-14 05:43:59 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2004-03-14 05:43:59 (GMT) |
commit | 49f9bd15ffeef67358a319f89faeaa31ad97d575 (patch) | |
tree | 21a7a17750ea5dc4b7042b9f35085933b42d73d5 /Modules/arraymodule.c | |
parent | 6e2ee866fa5cac9de821921a31ad4ba76dfde8d9 (diff) | |
download | cpython-49f9bd15ffeef67358a319f89faeaa31ad97d575.zip cpython-49f9bd15ffeef67358a319f89faeaa31ad97d575.tar.gz cpython-49f9bd15ffeef67358a319f89faeaa31ad97d575.tar.bz2 |
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.
Diffstat (limited to 'Modules/arraymodule.c')
-rw-r--r-- | Modules/arraymodule.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 4c3c726..ed2ea9d 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -775,16 +775,35 @@ setarrayitem(PyObject *a, int i, PyObject *v) } static int -array_do_extend(arrayobject *self, PyObject *bb) +array_iter_extend(arrayobject *self, PyObject *bb) { - int size; + PyObject *it, *v; - if (!array_Check(bb)) { - PyErr_Format(PyExc_TypeError, - "can only extend array with array (not \"%.200s\")", - bb->ob_type->tp_name); + 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)) + 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 @@ array_do_extend(arrayobject *self, PyObject *bb) 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 @@ array_extend(arrayobject *self, PyObject *bb) } 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 @@ append() -- append a new item to the end of the array\n\ 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\ |