summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/string_tests.py8
-rw-r--r--Lib/test/test_userstring.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst1
-rw-r--r--Objects/unicodeobject.c3
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;
}
}