From: Georg Brandl <georg@python.org>
Date: Fri, 3 Dec 2010 07:55:44 +0000 (+0000)
Subject: #10360: catch TypeError in WeakSet.__contains__, just like WeakKeyDictionary does.
X-Git-Tag: v3.2b1~103
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8de3fea1280d55377d40c6e04b64114f9da2fa6;p=python

#10360: catch TypeError in WeakSet.__contains__, just like WeakKeyDictionary does.
---

diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py
index 3de3bda695..42653699a3 100644
--- a/Lib/_weakrefset.py
+++ b/Lib/_weakrefset.py
@@ -66,7 +66,11 @@ class WeakSet:
         return sum(x() is not None for x in self.data)
 
     def __contains__(self, item):
-        return ref(item) in self.data
+        try:
+            wr = ref(item)
+        except TypeError:
+            return False
+        return wr in self.data
 
     def __reduce__(self):
         return (self.__class__, (list(self),),
diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py
index fe68b665c8..58a1f8790a 100644
--- a/Lib/test/test_weakset.py
+++ b/Lib/test/test_weakset.py
@@ -50,7 +50,8 @@ class TestWeakSet(unittest.TestCase):
     def test_contains(self):
         for c in self.letters:
             self.assertEqual(c in self.s, c in self.d)
-        self.assertRaises(TypeError, self.s.__contains__, [[]])
+        # 1 is not weakref'able, but that TypeError is caught by __contains__
+        self.assertNotIn(1, self.s)
         self.assertIn(self.obj, self.fs)
         del self.obj
         self.assertNotIn(ustr('F'), self.fs)
diff --git a/Misc/NEWS b/Misc/NEWS
index a6afdb9475..b15721bc08 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -33,6 +33,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #10360: In WeakSet, do not raise TypeErrors when testing for
+  membership of non-weakrefable objects.
+
 - Issue #940286: pydoc.Helper.help() ignores input/output init parameters.
 
 - Issue #1745035: Add a command size and data size limit to smtpd.py, to