diff -r 4c1b0c4405f6 Lib/_weakrefset.py --- a/Lib/_weakrefset.py Mon Nov 08 13:57:59 2010 +0100 +++ b/Lib/_weakrefset.py Mon Nov 08 11:57:40 2010 -0500 @@ -66,7 +66,12 @@ return sum(x() is not None for x in self.data) def __contains__(self, item): - return ref(item) in self.data + try: + weak = ref(item) + except TypeError: + return False + else: + return weak in self.data def __reduce__(self): return (self.__class__, (list(self),), diff -r 4c1b0c4405f6 Lib/test/test_weakset.py --- a/Lib/test/test_weakset.py Mon Nov 08 13:57:59 2010 +0100 +++ b/Lib/test/test_weakset.py Mon Nov 08 11:57:40 2010 -0500 @@ -62,7 +62,14 @@ 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__, [[]]) + # Don't raise for un-weakref-able types + self.assertNotIn(None, self.s) + self.assertNotIn([[]], self.s) + class NoHash(object): + def __hash__(self): + raise TypeError('Not hashable') + # ...but permit any hashing / comparison exceptions to propagate. + self.assertRaises(TypeError, self.s.__contains__, NoHash()) self.assertIn(self.obj, self.fs) del self.obj self.assertNotIn(SomeClass('F'), self.fs)