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.
This commit is contained in:
Terry Jan Reedy 2014-08-02 01:30:37 -04:00
parent 7f9cc9359b
commit ffff1440d1
8 changed files with 45 additions and 6 deletions

View File

@ -30,6 +30,12 @@ class CommonTest(seq_tests.CommonTest):
self.assertNotEqual(id(a), id(b)) self.assertNotEqual(id(a), id(b))
self.assertEqual(a, 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): def test_repr(self):
l0 = [] l0 = []
l2 = [0, 1, 2] l2 = [0, 1, 2]
@ -120,6 +126,10 @@ class CommonTest(seq_tests.CommonTest):
a[-1] = 9 a[-1] = 9
self.assertEqual(a, self.type2test([5,6,7,8,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): def test_delitem(self):
a = self.type2test([0, 1]) a = self.type2test([0, 1])
del a[1] del a[1]

View File

@ -699,6 +699,11 @@ class BaseBytesTest:
class BytesTest(BaseBytesTest, unittest.TestCase): class BytesTest(BaseBytesTest, unittest.TestCase):
type2test = bytes 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): def test_buffer_is_readonly(self):
fd = os.open(__file__, os.O_RDONLY) fd = os.open(__file__, os.O_RDONLY)
with open(fd, "rb", buffering=0) as f: with open(fd, "rb", buffering=0) as f:
@ -753,6 +758,17 @@ class BytesTest(BaseBytesTest, unittest.TestCase):
class ByteArrayTest(BaseBytesTest, unittest.TestCase): class ByteArrayTest(BaseBytesTest, unittest.TestCase):
type2test = bytearray 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): def test_nohash(self):
self.assertRaises(TypeError, hash, bytearray()) self.assertRaises(TypeError, hash, bytearray())

View File

@ -6,6 +6,11 @@ import pickle
class TupleTest(seq_tests.CommonTest): class TupleTest(seq_tests.CommonTest):
type2test = tuple 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): def test_constructors(self):
super().test_constructors() super().test_constructors()
# calling built-in types without argument must return empty # calling built-in types without argument must return empty

View File

@ -10,6 +10,10 @@ Release date: TBA
Core and Builtins 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`, - Issue #18395: Rename ``_Py_char2wchar()`` to :c:func:`Py_DecodeLocale`,
rename ``_Py_wchar2char()`` to :c:func:`Py_EncodeLocale`, and document rename ``_Py_wchar2char()`` to :c:func:`Py_EncodeLocale`, and document
these functions. these functions.

View File

@ -445,7 +445,9 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index)
} }
} }
else { 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; return NULL;
} }
} }
@ -650,7 +652,9 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu
} }
} }
else { 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; return -1;
} }

View File

@ -999,7 +999,7 @@ bytes_subscript(PyBytesObject* self, PyObject* item)
} }
else { else {
PyErr_Format(PyExc_TypeError, 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); Py_TYPE(item)->tp_name);
return NULL; return NULL;
} }

View File

@ -2444,7 +2444,7 @@ list_subscript(PyListObject* self, PyObject* item)
} }
else { else {
PyErr_Format(PyExc_TypeError, 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); item->ob_type->tp_name);
return NULL; return NULL;
} }
@ -2608,7 +2608,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
} }
else { else {
PyErr_Format(PyExc_TypeError, 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); item->ob_type->tp_name);
return -1; return -1;
} }

View File

@ -746,7 +746,7 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
} }
else { else {
PyErr_Format(PyExc_TypeError, 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); Py_TYPE(item)->tp_name);
return NULL; return NULL;
} }