summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_contains.py7
-rw-r--r--Lib/test/test_sqlite3/test_dbapi.py2
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-07-22-15-56-35.gh-issue-95144.FZYWX-.rst2
-rw-r--r--Objects/abstract.c12
4 files changed, 18 insertions, 5 deletions
diff --git a/Lib/test/test_contains.py b/Lib/test/test_contains.py
index 471d04a..259c954 100644
--- a/Lib/test/test_contains.py
+++ b/Lib/test/test_contains.py
@@ -24,8 +24,11 @@ class TestContains(unittest.TestCase):
self.assertNotIn(0, b)
self.assertIn(1, c)
self.assertNotIn(0, c)
- self.assertRaises(TypeError, lambda: 1 in a)
- self.assertRaises(TypeError, lambda: 1 not in a)
+ msg = "argument of type 'base_set' is not a container or iterable"
+ with self.assertRaisesRegex(TypeError, msg):
+ 1 in a
+ with self.assertRaisesRegex(TypeError, msg):
+ 1 not in a
# test char in string
self.assertIn('c', 'abc')
diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py
index 293bacc..488b401 100644
--- a/Lib/test/test_sqlite3/test_dbapi.py
+++ b/Lib/test/test_sqlite3/test_dbapi.py
@@ -1434,7 +1434,7 @@ class BlobTests(unittest.TestCase):
self.blob + self.blob
with self.assertRaisesRegex(TypeError, "unsupported operand"):
self.blob * 5
- with self.assertRaisesRegex(TypeError, "is not iterable"):
+ with self.assertRaisesRegex(TypeError, "is not.+iterable"):
b"a" in self.blob
def test_blob_context_manager(self):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-07-22-15-56-35.gh-issue-95144.FZYWX-.rst b/Misc/NEWS.d/next/Core and Builtins/2022-07-22-15-56-35.gh-issue-95144.FZYWX-.rst
new file mode 100644
index 0000000..83b1126
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-07-22-15-56-35.gh-issue-95144.FZYWX-.rst
@@ -0,0 +1,2 @@
+Improve the error message from ``a in b`` when ``b`` is not a container
+to mention the term "container".
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 2008170..afb0687 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -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_INDEX: 0-based index of first occurrence of obj in seq;
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
_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
@@ -2158,7 +2158,15 @@ _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
it = PyObject_GetIter(seq);
if (it == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
- type_error("argument of type '%.200s' is not iterable", seq);
+ 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);
+ }
}
return -1;
}