From 64ecfe9a6db069d5b3ab937f9774de35894db05b Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 10 Nov 2019 13:41:04 -0800 Subject: [PATCH 1/4] bpo-38761: Register WeakSet as a MutableSet --- Lib/_collections_abc.py | 4 +++- Lib/test/test_weakset.py | 4 ++++ .../next/Library/2019-11-10-13-40-33.bpo-38761.P1UUIZ.rst | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-10-13-40-33.bpo-38761.P1UUIZ.rst diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 2b2ddba170e1b1..ce6356cc148ce3 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -551,7 +551,9 @@ def _hash(self): return h Set.register(frozenset) - +import _weakrefset +Set.register(_weakrefset.WeakSet) +del _weakrefset class MutableSet(Set): """A mutable set is a finite, iterable container. diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 569facdd30c11c..2bcc0a3f9bc3da 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -2,6 +2,7 @@ from weakref import WeakSet import string from collections import UserString as ustr +from collections.abc import MutableSet import gc import contextlib @@ -437,6 +438,9 @@ def test_len_race(self): def test_repr(self): assert repr(self.s) == repr(self.s.data) + def test_abc(self): + self.assertIsInstance(self.s, MutableSet) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-11-10-13-40-33.bpo-38761.P1UUIZ.rst b/Misc/NEWS.d/next/Library/2019-11-10-13-40-33.bpo-38761.P1UUIZ.rst new file mode 100644 index 00000000000000..4dde5ebc3208ca --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-10-13-40-33.bpo-38761.P1UUIZ.rst @@ -0,0 +1 @@ +WeakSet is now registered as a collections.abc.MutableSet. From d5fc2925be72c65f6dfa953cb62e48a38d6ec1de Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 10 Nov 2019 14:41:05 -0800 Subject: [PATCH 2/4] Register to both Set and MutableSet --- Lib/_collections_abc.py | 3 +++ Lib/test/test_weakset.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index ce6356cc148ce3..852032b68a9079 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -635,6 +635,9 @@ def __isub__(self, it): return self MutableSet.register(set) +import _weakrefset +MutableSet.register(_weakrefset.WeakSet) +del _weakrefset ### MAPPINGS ### diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 2bcc0a3f9bc3da..49a9b5c3c658a8 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -2,7 +2,7 @@ from weakref import WeakSet import string from collections import UserString as ustr -from collections.abc import MutableSet +from collections.abc import Set, MutableSet import gc import contextlib @@ -439,6 +439,7 @@ def test_repr(self): assert repr(self.s) == repr(self.s.data) def test_abc(self): + self.assertIsInstance(self.s, Set) self.assertIsInstance(self.s, MutableSet) From 116881843b433c9df431b5bcf1f648e21a36b468 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 10 Nov 2019 18:07:43 -0800 Subject: [PATCH 3/4] Move registration to the weakref module --- Lib/_collections_abc.py | 6 ------ Lib/weakref.py | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 852032b68a9079..ed3b0778984044 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -551,9 +551,6 @@ def _hash(self): return h Set.register(frozenset) -import _weakrefset -Set.register(_weakrefset.WeakSet) -del _weakrefset class MutableSet(Set): """A mutable set is a finite, iterable container. @@ -635,9 +632,6 @@ def __isub__(self, it): return self MutableSet.register(set) -import _weakrefset -MutableSet.register(_weakrefset.WeakSet) -del _weakrefset ### MAPPINGS ### diff --git a/Lib/weakref.py b/Lib/weakref.py index d17b3ed38eacb7..e3c2ce2d9b8b86 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -33,6 +33,9 @@ "WeakSet", "WeakMethod", "finalize"] +_collections_abc.Set.register(WeakSet) +_collections_abc.MutableSet.register(WeakSet) + class WeakMethod(ref): """ A custom `weakref.ref` subclass which simulates a weak reference to From ce40418a6454efba8d2d16ead22aeee55a0375f5 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 10 Nov 2019 18:10:09 -0800 Subject: [PATCH 4/4] Restore line spacing --- Lib/_collections_abc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index ed3b0778984044..2b2ddba170e1b1 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -552,6 +552,7 @@ def _hash(self): Set.register(frozenset) + class MutableSet(Set): """A mutable set is a finite, iterable container.