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