Skip to content

Commit c4c841f

Browse files
Copilotcsm10495
andcommitted
Improve error messages for bounded iteration on extended slice assignment
Co-authored-by: csm10495 <5749838+csm10495@users.noreply.github.com> Agent-Logs-Url: https://github.com/csm10495/cpython/sessions/48a4582d-926d-44bf-aa9b-8078648099f4
1 parent 118e9ec commit c4c841f

2 files changed

Lines changed: 34 additions & 9 deletions

File tree

Lib/test/list_tests.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,10 @@ def infinite_gen():
210210
yield "foo"
211211

212212
a = self.type2test(range(4))
213-
with self.assertRaises(ValueError):
213+
with self.assertRaises(ValueError) as cm:
214214
a[::2] = infinite_gen()
215+
self.assertIn("yielded more items than extended slice of size 2",
216+
str(cm.exception))
215217
# list should be unchanged after the failed assignment
216218
self.assertEqual(a, self.type2test(range(4)))
217219

@@ -235,14 +237,18 @@ def test_extended_slice_assign_iterator(self):
235237

236238
# Too few items from an iterator
237239
a = self.type2test(range(10))
238-
with self.assertRaises(ValueError):
240+
with self.assertRaises(ValueError) as cm:
239241
a[::2] = iter(range(3))
242+
self.assertIn("sequence of size 3 to extended slice of larger size",
243+
str(cm.exception))
240244
self.assertEqual(a, self.type2test(range(10)))
241245

242246
# Too many items from an iterator
243247
a = self.type2test(range(10))
244-
with self.assertRaises(ValueError):
248+
with self.assertRaises(ValueError) as cm:
245249
a[::2] = iter(range(10))
250+
self.assertIn("yielded more items than extended slice of size 5",
251+
str(cm.exception))
246252
self.assertEqual(a, self.type2test(range(10)))
247253

248254
def test_delslice(self):

Objects/listobject.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3821,6 +3821,7 @@ list_ass_subscript_lock_held(PyObject *_self, PyObject *item, PyObject *value)
38213821
PyObject **garbage, **seqitems, **selfitems;
38223822
Py_ssize_t i;
38233823
size_t cur;
3824+
int bounded_iter = 0;
38243825

38253826
/* protect against a[::-1] = a */
38263827
if (self == (PyListObject*)value) {
@@ -3882,6 +3883,7 @@ list_ass_subscript_lock_held(PyObject *_self, PyObject *item, PyObject *value)
38823883
if (j < alloc) {
38833884
Py_SET_SIZE(seq, j);
38843885
}
3886+
bounded_iter = 1;
38853887
}
38863888
else {
38873889
seq = PySequence_Fast(value,
@@ -3901,12 +3903,29 @@ list_ass_subscript_lock_held(PyObject *_self, PyObject *item, PyObject *value)
39013903
}
39023904

39033905
if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
3904-
PyErr_Format(PyExc_ValueError,
3905-
"attempt to assign sequence of "
3906-
"size %zd to extended slice of "
3907-
"size %zd",
3908-
PySequence_Fast_GET_SIZE(seq),
3909-
slicelength);
3906+
if (bounded_iter &&
3907+
PySequence_Fast_GET_SIZE(seq) > slicelength) {
3908+
PyErr_Format(PyExc_ValueError,
3909+
"attempt to assign iterable that yielded "
3910+
"more items than extended slice of "
3911+
"size %zd",
3912+
slicelength);
3913+
}
3914+
else if (bounded_iter) {
3915+
PyErr_Format(PyExc_ValueError,
3916+
"attempt to assign sequence of "
3917+
"size %zd to extended slice of "
3918+
"larger size",
3919+
PySequence_Fast_GET_SIZE(seq));
3920+
}
3921+
else {
3922+
PyErr_Format(PyExc_ValueError,
3923+
"attempt to assign sequence of "
3924+
"size %zd to extended slice of "
3925+
"size %zd",
3926+
PySequence_Fast_GET_SIZE(seq),
3927+
slicelength);
3928+
}
39103929
Py_DECREF(seq);
39113930
return -1;
39123931
}

0 commit comments

Comments
 (0)