diff options
author | Meador Inge <meadori@gmail.com> | 2012-03-05 04:40:15 (GMT) |
---|---|---|
committer | Meador Inge <meadori@gmail.com> | 2012-03-05 04:40:15 (GMT) |
commit | f1c42599bae9fcc47eb5f5d38ff077c000fef38f (patch) | |
tree | a7c38b9938b7f9153ac791fc629740738a6e3173 | |
parent | 5102bf476c509b4fa82e5a6b7419c6f430c78202 (diff) | |
parent | 653f932eff642065061f36693d59e10507523a6f (diff) | |
download | cpython-f1c42599bae9fcc47eb5f5d38ff077c000fef38f.zip cpython-f1c42599bae9fcc47eb5f5d38ff077c000fef38f.tar.gz cpython-f1c42599bae9fcc47eb5f5d38ff077c000fef38f.tar.bz2 |
Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
-rw-r--r-- | Lib/_weakrefset.py | 12 | ||||
-rw-r--r-- | Lib/test/test_weakset.py | 34 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
3 files changed, 33 insertions, 17 deletions
diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py index 1f41841..6a98b88 100644 --- a/Lib/_weakrefset.py +++ b/Lib/_weakrefset.py @@ -152,17 +152,17 @@ class WeakSet: def issubset(self, other): return self.data.issubset(ref(item) for item in other) - __lt__ = issubset + __le__ = issubset - def __le__(self, other): - return self.data <= set(ref(item) for item in other) + def __lt__(self, other): + return self.data < set(ref(item) for item in other) def issuperset(self, other): return self.data.issuperset(ref(item) for item in other) - __gt__ = issuperset + __ge__ = issuperset - def __ge__(self, other): - return self.data >= set(ref(item) for item in other) + def __gt__(self, other): + return self.data > set(ref(item) for item in other) def __eq__(self, other): if not isinstance(other, self.__class__): diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 3c71f62..4d3878f 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -28,6 +28,12 @@ class TestWeakSet(unittest.TestCase): # need to keep references to them self.items = [ustr(c) for c in ('a', 'b', 'c')] self.items2 = [ustr(c) for c in ('x', 'y', 'z')] + self.ab_items = [ustr(c) for c in 'ab'] + self.abcde_items = [ustr(c) for c in 'abcde'] + self.def_items = [ustr(c) for c in 'def'] + self.ab_weakset = WeakSet(self.ab_items) + self.abcde_weakset = WeakSet(self.abcde_items) + self.def_weakset = WeakSet(self.def_items) self.letters = [ustr(c) for c in string.ascii_letters] self.s = WeakSet(self.items) self.d = dict.fromkeys(self.items) @@ -137,22 +143,28 @@ class TestWeakSet(unittest.TestCase): self.assertEqual(self.s ^ frozenset(self.items2), i) def test_sub_and_super(self): - pl, ql, rl = map(lambda s: [ustr(c) for c in s], ['ab', 'abcde', 'def']) - p, q, r = map(WeakSet, (pl, ql, rl)) - self.assertTrue(p < q) - self.assertTrue(p <= q) - self.assertTrue(q <= q) - self.assertTrue(q > p) - self.assertTrue(q >= p) - self.assertFalse(q < r) - self.assertFalse(q <= r) - self.assertFalse(q > r) - self.assertFalse(q >= r) + self.assertTrue(self.ab_weakset <= self.abcde_weakset) + self.assertTrue(self.abcde_weakset <= self.abcde_weakset) + self.assertTrue(self.abcde_weakset >= self.ab_weakset) + self.assertFalse(self.abcde_weakset <= self.def_weakset) + self.assertFalse(self.abcde_weakset >= self.def_weakset) self.assertTrue(set('a').issubset('abc')) self.assertTrue(set('abc').issuperset('a')) self.assertFalse(set('a').issubset('cbs')) self.assertFalse(set('cbs').issuperset('a')) + def test_lt(self): + self.assertTrue(self.ab_weakset < self.abcde_weakset) + self.assertFalse(self.abcde_weakset < self.def_weakset) + self.assertFalse(self.ab_weakset < self.ab_weakset) + self.assertFalse(WeakSet() < WeakSet()) + + def test_gt(self): + self.assertTrue(self.abcde_weakset > self.ab_weakset) + self.assertFalse(self.abcde_weakset > self.def_weakset) + self.assertFalse(self.ab_weakset > self.ab_weakset) + self.assertFalse(WeakSet() > WeakSet()) + def test_gc(self): # Create a nest of cycles to exercise overall ref count check s = WeakSet(Foo() for i in range(1000)) @@ -511,6 +511,10 @@ Core and Builtins Library ------- +- Issue #14195: An issue that caused weakref.WeakSet instances to incorrectly + return True for a WeakSet instance 'a' in both 'a < a' and 'a > a' has been + fixed. + - Issue #14166: Pickler objects now have an optional ``dispatch_table`` attribute which allows to set custom per-pickler reduction functions. Patch by sbt. |