Issue #26194: Inserting into a full deque to raise an IndexError

This commit is contained in:
Raymond Hettinger 2016-02-01 21:19:22 -08:00
parent 3e7230904e
commit b00da57561
4 changed files with 18 additions and 20 deletions

View File

@ -477,8 +477,8 @@ or subtracting from an empty counter.
Insert *x* into the deque at position *i*.
If the insertion causes a bounded deque to grow beyond *maxlen*, the
rightmost element is then removed to restore the size limit.
If the insertion would cause a bounded deque to grow beyond *maxlen*,
an :exc:`IndexError` is raised.
.. versionadded:: 3.5

View File

@ -304,19 +304,20 @@ class TestBasic(unittest.TestCase):
s.insert(i, 'Z')
self.assertEqual(list(d), s)
def test_index_bug_26194(self):
def test_insert_bug_26194(self):
data = 'ABC'
for i in range(len(data) + 1):
d = deque(data, len(data))
d.insert(i, None)
s = list(data)
s.insert(i, None)
s.pop()
self.assertEqual(list(d), s)
if i < len(data):
self.assertIsNone(d[i])
d = deque(data, maxlen=len(data))
with self.assertRaises(IndexError):
d.insert(2, None)
elements = 'ABCDEFGHI'
for i in range(-len(elements), len(elements)):
d = deque(elements, maxlen=len(elements)+1)
d.insert(i, 'Z')
if i >= 0:
self.assertEqual(d[i], 'Z')
else:
self.assertTrue(None not in d)
self.assertEqual(d[i-1], 'Z')
def test_imul(self):
for n in (-10, -1, 0, 1, 2, 10, 1000):

View File

@ -22,8 +22,8 @@ Core and Builtins
compiler issues.
- Issue #26194: Deque.insert() gave odd results for bounded deques that had
reached their maximum size. Now, the insert will happen normally and then
any overflowing element will be truncated from the right side.
reached their maximum size. Now an IndexError will be raised when attempting
to insert into a full deque.
- Issue #25843: When compiling code, don't merge constants if they are equal
but have a different types. For example, ``f1, f2 = lambda: 1, lambda: 1.0``

View File

@ -973,16 +973,13 @@ deque_insert(dequeobject *deque, PyObject *args)
Py_ssize_t index;
Py_ssize_t n = Py_SIZE(deque);
PyObject *value;
PyObject *oldvalue;
PyObject *rv;
if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
return NULL;
if (deque->maxlen == Py_SIZE(deque)) {
if (index >= deque->maxlen || Py_SIZE(deque) == 0)
Py_RETURN_NONE;
oldvalue = deque_pop(deque, NULL);
Py_DECREF(oldvalue);
PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
return NULL;
}
if (index >= n)
return deque_append(deque, value);