Skip to content

Commit

Permalink
Issue #22077: Improve index error messages for bytearrays, bytes, lis…
Browse files Browse the repository at this point in the history
…ts, and

tuples by adding 'or slices'. Added ', not <typename' for bytearrays.
Original patch by Claudiu Popa.
  • Loading branch information
terryjreedy committed Aug 2, 2014
1 parent 7f9cc93 commit ffff144
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 6 deletions.
10 changes: 10 additions & 0 deletions Lib/test/list_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ def test_init(self):
self.assertNotEqual(id(a), id(b))
self.assertEqual(a, b)

def test_getitem_error(self):
msg = "list indices must be integers or slices"
with self.assertRaisesRegex(TypeError, msg):
a = []
a['a'] = "python"

def test_repr(self):
l0 = []
l2 = [0, 1, 2]
Expand Down Expand Up @@ -120,6 +126,10 @@ def test_setitem(self):
a[-1] = 9
self.assertEqual(a, self.type2test([5,6,7,8,9]))

msg = "list indices must be integers or slices"
with self.assertRaisesRegex(TypeError, msg):
a['a'] = "python"

def test_delitem(self):
a = self.type2test([0, 1])
del a[1]
Expand Down
16 changes: 16 additions & 0 deletions Lib/test/test_bytes.py
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,11 @@ def test_find_etc_raise_correct_error_messages(self):
class BytesTest(BaseBytesTest, unittest.TestCase):
type2test = bytes

def test_getitem_error(self):
msg = "byte indices must be integers or slices"
with self.assertRaisesRegex(TypeError, msg):
b'python'['a']

def test_buffer_is_readonly(self):
fd = os.open(__file__, os.O_RDONLY)
with open(fd, "rb", buffering=0) as f:
Expand Down Expand Up @@ -753,6 +758,17 @@ def test_from_format(self):
class ByteArrayTest(BaseBytesTest, unittest.TestCase):
type2test = bytearray

def test_getitem_error(self):
msg = "bytearray indices must be integers or slices"
with self.assertRaisesRegex(TypeError, msg):
bytearray(b'python')['a']

def test_setitem_error(self):
msg = "bytearray indices must be integers or slices"
with self.assertRaisesRegex(TypeError, msg):
b = bytearray(b'python')
b['a'] = "python"

def test_nohash(self):
self.assertRaises(TypeError, hash, bytearray())

Expand Down
5 changes: 5 additions & 0 deletions Lib/test/test_tuple.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
class TupleTest(seq_tests.CommonTest):
type2test = tuple

def test_getitem_error(self):
msg = "tuple indices must be integers or slices"
with self.assertRaisesRegex(TypeError, msg):
()['a']

def test_constructors(self):
super().test_constructors()
# calling built-in types without argument must return empty
Expand Down
4 changes: 4 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ Release date: TBA
Core and Builtins
-----------------

- Issue #22077: Improve index error messages for bytearrays, bytes, lists,
and tuples by adding 'or slices'. Added ', not <typename' for bytearrays.
Original patch by Claudiu Popa.

- Issue #18395: Rename ``_Py_char2wchar()`` to :c:func:`Py_DecodeLocale`,
rename ``_Py_wchar2char()`` to :c:func:`Py_EncodeLocale`, and document
these functions.
Expand Down
8 changes: 6 additions & 2 deletions Objects/bytearrayobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,9 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index)
}
}
else {
PyErr_SetString(PyExc_TypeError, "bytearray indices must be integers");
PyErr_Format(PyExc_TypeError,
"bytearray indices must be integers or slices, not %.200s",
Py_TYPE(index)->tp_name);
return NULL;
}
}
Expand Down Expand Up @@ -650,7 +652,9 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu
}
}
else {
PyErr_SetString(PyExc_TypeError, "bytearray indices must be integer");
PyErr_Format(PyExc_TypeError,
"bytearray indices must be integers or slices, not %.200s",
Py_TYPE(index)->tp_name);
return -1;
}

Expand Down
2 changes: 1 addition & 1 deletion Objects/bytesobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,7 @@ bytes_subscript(PyBytesObject* self, PyObject* item)
}
else {
PyErr_Format(PyExc_TypeError,
"byte indices must be integers, not %.200s",
"byte indices must be integers or slices, not %.200s",
Py_TYPE(item)->tp_name);
return NULL;
}
Expand Down
4 changes: 2 additions & 2 deletions Objects/listobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -2444,7 +2444,7 @@ list_subscript(PyListObject* self, PyObject* item)
}
else {
PyErr_Format(PyExc_TypeError,
"list indices must be integers, not %.200s",
"list indices must be integers or slices, not %.200s",
item->ob_type->tp_name);
return NULL;
}
Expand Down Expand Up @@ -2608,7 +2608,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
}
else {
PyErr_Format(PyExc_TypeError,
"list indices must be integers, not %.200s",
"list indices must be integers or slices, not %.200s",
item->ob_type->tp_name);
return -1;
}
Expand Down
2 changes: 1 addition & 1 deletion Objects/tupleobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
}
else {
PyErr_Format(PyExc_TypeError,
"tuple indices must be integers, not %.200s",
"tuple indices must be integers or slices, not %.200s",
Py_TYPE(item)->tp_name);
return NULL;
}
Expand Down

0 comments on commit ffff144

Please sign in to comment.