mirror of https://github.com/python/cpython
gh-95144: Improve error message of `... in None` (GH-119888)
This commit is contained in:
parent
65fededf9c
commit
dc03ce797a
|
@ -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')
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Improve the error message from ``a in b`` when ``b`` is not a container
|
||||||
|
to mention the term "container".
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue