gh-95144: Improve error message of `... in None` (GH-119888)

This commit is contained in:
Zachary Ware 2024-07-12 11:34:17 -05:00 committed by GitHub
parent 65fededf9c
commit dc03ce797a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 5 deletions

View File

@ -24,8 +24,11 @@ class TestContains(unittest.TestCase):
self.assertNotIn(0, b) self.assertNotIn(0, b)
self.assertIn(1, c) self.assertIn(1, c)
self.assertNotIn(0, c) self.assertNotIn(0, c)
self.assertRaises(TypeError, lambda: 1 in a) msg = "argument of type 'base_set' is not a container or iterable"
self.assertRaises(TypeError, lambda: 1 not in a) with self.assertRaisesRegex(TypeError, msg):
1 in a
with self.assertRaisesRegex(TypeError, msg):
1 not in a
# test char in string # test char in string
self.assertIn('c', 'abc') self.assertIn('c', 'abc')

View File

@ -1434,7 +1434,7 @@ class BlobTests(unittest.TestCase):
self.blob + self.blob self.blob + self.blob
with self.assertRaisesRegex(TypeError, "unsupported operand"): with self.assertRaisesRegex(TypeError, "unsupported operand"):
self.blob * 5 self.blob * 5
with self.assertRaisesRegex(TypeError, "is not iterable"): with self.assertRaisesRegex(TypeError, "is not.+iterable"):
b"a" in self.blob b"a" in self.blob
def test_blob_context_manager(self): def test_blob_context_manager(self):

View File

@ -0,0 +1,2 @@
Improve the error message from ``a in b`` when ``b`` is not a container
to mention the term "container".

View File

@ -2141,7 +2141,7 @@ PySequence_Fast(PyObject *v, const char *m)
PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq. PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq; PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
set ValueError and return -1 if none found; also return -1 on error. set ValueError and return -1 if none found; also return -1 on error.
Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error. PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
*/ */
Py_ssize_t Py_ssize_t
_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation) _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
@ -2158,8 +2158,16 @@ _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
it = PyObject_GetIter(seq); it = PyObject_GetIter(seq);
if (it == NULL) { if (it == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError)) { if (PyErr_ExceptionMatches(PyExc_TypeError)) {
if (operation == PY_ITERSEARCH_CONTAINS) {
type_error(
"argument of type '%.200s' is not a container or iterable",
seq
);
}
else {
type_error("argument of type '%.200s' is not iterable", seq); type_error("argument of type '%.200s' is not iterable", seq);
} }
}
return -1; return -1;
} }