diff options
-rw-r--r-- | Lib/test/string_tests.py | 8 | ||||
-rw-r--r-- | Lib/test/test_userstring.py | 4 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst | 1 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 3 |
4 files changed, 13 insertions, 3 deletions
diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 840d7bb..089701c 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -80,12 +80,14 @@ class BaseTest: self.assertIsNot(obj, realresult) # check that obj.method(*args) raises exc - def checkraises(self, exc, obj, methodname, *args): + def checkraises(self, exc, obj, methodname, *args, expected_msg=None): obj = self.fixtype(obj) args = self.fixtype(args) with self.assertRaises(exc) as cm: getattr(obj, methodname)(*args) self.assertNotEqual(str(cm.exception), '') + if expected_msg is not None: + self.assertEqual(str(cm.exception), expected_msg) # call obj.method(*args) without any checks def checkcall(self, obj, methodname, *args): @@ -1195,6 +1197,10 @@ class MixinStrUnicodeUserStringTest: self.checkraises(TypeError, 'abc', '__getitem__', 'def') + for idx_type in ('def', object()): + expected_msg = "string indices must be integers, not '{}'".format(type(idx_type).__name__) + self.checkraises(TypeError, 'abc', '__getitem__', idx_type, expected_msg=expected_msg) + def test_slice(self): self.checkequal('abc', 'abc', '__getitem__', slice(0, 1000)) self.checkequal('abc', 'abc', '__getitem__', slice(0, 3)) diff --git a/Lib/test/test_userstring.py b/Lib/test/test_userstring.py index 4d1d8b6..51b4f60 100644 --- a/Lib/test/test_userstring.py +++ b/Lib/test/test_userstring.py @@ -27,12 +27,14 @@ class UserStringTest( realresult ) - def checkraises(self, exc, obj, methodname, *args): + def checkraises(self, exc, obj, methodname, *args, expected_msg=None): obj = self.fixtype(obj) # we don't fix the arguments, because UserString can't cope with it with self.assertRaises(exc) as cm: getattr(obj, methodname)(*args) self.assertNotEqual(str(cm.exception), '') + if expected_msg is not None: + self.assertEqual(str(cm.exception), expected_msg) def checkcall(self, object, methodname, *args): object = self.fixtype(object) diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst new file mode 100644 index 0000000..3b82e42 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst @@ -0,0 +1 @@ +Improve :func:`str.__getitem__` error message diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index c316caf..3e6b70b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14279,7 +14279,8 @@ unicode_subscript(PyObject* self, PyObject* item) assert(_PyUnicode_CheckConsistency(result, 1)); return result; } else { - PyErr_SetString(PyExc_TypeError, "string indices must be integers"); + PyErr_Format(PyExc_TypeError, "string indices must be integers, not '%.200s'", + Py_TYPE(item)->tp_name); return NULL; } } |