Mercurial > cpython-lru_cache-weakref
changeset 57633:b5a4acbeaaa1 2.6
Fix variants of deque.extend: d.extend(d) d+=d d.extendleft(d)
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Thu, 10 Dec 2009 05:56:49 +0000 |
| parents | 83a761939975 |
| children | b27d946389e7 |
| files | Lib/test/test_deque.py Misc/NEWS Modules/_collectionsmodule.c |
| diffstat | 3 files changed, 53 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/test/test_deque.py Tue Dec 08 16:39:36 2009 +0000 +++ b/Lib/test/test_deque.py Thu Dec 10 05:56:49 2009 +0000 @@ -109,12 +109,23 @@ self.assertRaises(TypeError, d.extend, 1) d.extend('bcd') self.assertEqual(list(d), list('abcd')) + d.extend(d) + self.assertEqual(list(d), list('abcdabcd')) + + def test_iadd(self): + d = deque('a') + d += 'bcd' + self.assertEqual(list(d), list('abcd')) + d += d + self.assertEqual(list(d), list('abcdabcd')) def test_extendleft(self): d = deque('a') self.assertRaises(TypeError, d.extendleft, 1) d.extendleft('bcd') self.assertEqual(list(d), list(reversed('abcd'))) + d.extendleft(d) + self.assertEqual(list(d), list('abcddcba')) d = deque() d.extendleft(range(1000)) self.assertEqual(list(d), list(reversed(range(1000))))
--- a/Misc/NEWS Tue Dec 08 16:39:36 2009 +0000 +++ b/Misc/NEWS Thu Dec 10 05:56:49 2009 +0000 @@ -33,6 +33,8 @@ Library ------- +- Fix variations of extending deques: d.extend(d) d.extendleft(d) d+=d + - Issue #1923: Fixed the removal of meaningful spaces when PKG-INFO is generated in Distutils. Patch by Stephen Emslie.
--- a/Modules/_collectionsmodule.c Tue Dec 08 16:39:36 2009 +0000 +++ b/Modules/_collectionsmodule.c Thu Dec 10 05:56:49 2009 +0000 @@ -281,6 +281,17 @@ { PyObject *it, *item; + /* Handle case where id(deque) == id(iterable) */ + if ((PyObject *)deque == iterable) { + PyObject *result; + PyObject *s = PySequence_List(iterable); + if (s == NULL) + return NULL; + result = deque_extend(deque, s); + Py_DECREF(s); + return result; + } + it = PyObject_GetIter(iterable); if (it == NULL) return NULL; @@ -319,6 +330,17 @@ { PyObject *it, *item; + /* Handle case where id(deque) == id(iterable) */ + if ((PyObject *)deque == iterable) { + PyObject *result; + PyObject *s = PySequence_List(iterable); + if (s == NULL) + return NULL; + result = deque_extendleft(deque, s); + Py_DECREF(s); + return result; + } + it = PyObject_GetIter(iterable); if (it == NULL) return NULL; @@ -352,6 +374,19 @@ PyDoc_STRVAR(extendleft_doc, "Extend the left side of the deque with elements from the iterable"); +static PyObject * +deque_inplace_concat(dequeobject *deque, PyObject *other) +{ + PyObject *result; + + result = deque_extend(deque, other); + if (result == NULL) + return result; + Py_DECREF(result); + Py_INCREF(deque); + return (PyObject *)deque; +} + static int _deque_rotate(dequeobject *deque, Py_ssize_t n) { @@ -854,6 +889,11 @@ (ssizeargfunc)deque_item, /* sq_item */ 0, /* sq_slice */ (ssizeobjargproc)deque_ass_item, /* sq_ass_item */ + 0, /* sq_ass_slice */ + 0, /* sq_contains */ + (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */ + 0, /* sq_inplace_repeat */ + }; /* deque object ********************************************************/
