bpo-44110: Improve string's __getitem__ error message (GH-26042)

This commit is contained in:
Miguel Brito 2021-06-27 13:04:57 +01:00 committed by GitHub
parent 7569c0fe91
commit ed1076428c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 3 deletions

View File

@ -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))

View File

@ -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)

View File

@ -0,0 +1 @@
Improve :func:`str.__getitem__` error message

View File

@ -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;
}
}