From e3d0334518b336737be413ed2c6e86a35724a154 Mon Sep 17 00:00:00 2001 From: Stephen Morton Date: Tue, 5 Nov 2024 12:30:06 -0800 Subject: [PATCH 1/5] add __iter__ to multiprocessing.managers.ListProxy also validate in the tests that ListProxy has all MutableSequence methods and DictProxy has all MutableMapping methods. --- Lib/multiprocessing/managers.py | 2 +- Lib/test/_test_multiprocessing.py | 17 +++++++++++++++++ ...24-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index a5d2f53613952e..c549b36e68d5f7 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -1154,7 +1154,7 @@ def set(self, value): BaseListProxy = MakeProxyType('BaseListProxy', ( '__add__', '__contains__', '__delitem__', '__getitem__', '__imul__', - '__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__', + '__iter__', '__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort', )) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 77b618c684475a..c959f10e4477ee 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2336,6 +2336,15 @@ def test_list_isinstance(self): a = self.list() self.assertIsInstance(a, collections.abc.MutableSequence) + mutable_sequence_methods = ( + '__contains__', '__delitem__', '__getitem__', '__iadd__', + '__iter__', '__len__', '__reversed__', '__setitem__', 'append', + 'clear', 'count', 'extend', 'index', 'insert', 'pop', 'remove', + 'reverse', + ) + for name in mutable_sequence_methods: + self.assertTrue(callable(getattr(a, name))) + def test_list_iter(self): a = self.list(list(range(10))) it = iter(a) @@ -2380,6 +2389,14 @@ def test_dict_isinstance(self): a = self.dict() self.assertIsInstance(a, collections.abc.MutableMapping) + mutable_mapping_methods = ( + '__contains__', '__delitem__', '__eq__', '__getitem__', '__iter__', + '__len__', '__ne__', '__setitem__', 'clear', 'get', 'items', + 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', + ) + for name in mutable_mapping_methods: + self.assertTrue(callable(getattr(a, name))) + def test_dict_iter(self): d = self.dict() indices = list(range(65, 70)) diff --git a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst new file mode 100644 index 00000000000000..caff6e1230987f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst @@ -0,0 +1 @@ +add ``__iter__`` method to :class:`!multiprocessing.managers.ListProxy` From f2dd1c751797a3d30afc79272548747fe6bcb04b Mon Sep 17 00:00:00 2001 From: Stephen Morton Date: Tue, 5 Nov 2024 12:55:16 -0800 Subject: [PATCH 2/5] fix NEWS entry --- .../next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst index caff6e1230987f..6aebfeb096b138 100644 --- a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst +++ b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst @@ -1 +1 @@ -add ``__iter__`` method to :class:`!multiprocessing.managers.ListProxy` +add ``__iter__`` method to :class:`multiprocessing.managers.ListProxy` From 36cf88b4094ff55922a95dd11f39422d764b2058 Mon Sep 17 00:00:00 2001 From: Stephen Morton Date: Tue, 5 Nov 2024 12:59:42 -0800 Subject: [PATCH 3/5] put the ! back --- .../next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst index 6aebfeb096b138..caff6e1230987f 100644 --- a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst +++ b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst @@ -1 +1 @@ -add ``__iter__`` method to :class:`multiprocessing.managers.ListProxy` +add ``__iter__`` method to :class:`!multiprocessing.managers.ListProxy` From 8d720d8d684cd78e77801996e2a8317583b6ab82 Mon Sep 17 00:00:00 2001 From: Stephen Morton Date: Tue, 5 Nov 2024 13:31:14 -0800 Subject: [PATCH 4/5] don't add __iter__ to ListProxy, add a note to the test --- Lib/multiprocessing/managers.py | 2 +- Lib/test/_test_multiprocessing.py | 5 ++++- .../Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index c549b36e68d5f7..a5d2f53613952e 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -1154,7 +1154,7 @@ def set(self, value): BaseListProxy = MakeProxyType('BaseListProxy', ( '__add__', '__contains__', '__delitem__', '__getitem__', '__imul__', - '__iter__', '__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__', + '__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort', )) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index c959f10e4477ee..0a7e0ad4843caf 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2336,9 +2336,12 @@ def test_list_isinstance(self): a = self.list() self.assertIsInstance(a, collections.abc.MutableSequence) + # MutableSequence also has __iter__, but we can iterate over + # ListProxy using __getitem__ instead. Adding __iter__ to ListProxy + # would change the behavior of a list modified during iteration. mutable_sequence_methods = ( '__contains__', '__delitem__', '__getitem__', '__iadd__', - '__iter__', '__len__', '__reversed__', '__setitem__', 'append', + '__len__', '__reversed__', '__setitem__', 'append', 'clear', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', ) diff --git a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst b/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst deleted file mode 100644 index caff6e1230987f..00000000000000 --- a/Misc/NEWS.d/next/Library/2024-11-05-12-24-49.gh-issue-126417.VrKYyJ.rst +++ /dev/null @@ -1 +0,0 @@ -add ``__iter__`` method to :class:`!multiprocessing.managers.ListProxy` From f81aa5e2e9f6e83208e5b4ba97200ff179431f8f Mon Sep 17 00:00:00 2001 From: Stephen Morton Date: Tue, 5 Nov 2024 15:15:14 -0800 Subject: [PATCH 5/5] use subtests Co-authored-by: Alex Waygood --- Lib/test/_test_multiprocessing.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 0a7e0ad4843caf..cf437b2ce99e81 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2346,7 +2346,8 @@ def test_list_isinstance(self): 'reverse', ) for name in mutable_sequence_methods: - self.assertTrue(callable(getattr(a, name))) + with self.subTest(name=name): + self.assertTrue(callable(getattr(a, name))) def test_list_iter(self): a = self.list(list(range(10))) @@ -2398,7 +2399,8 @@ def test_dict_isinstance(self): 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', ) for name in mutable_mapping_methods: - self.assertTrue(callable(getattr(a, name))) + with self.subTest(name=name): + self.assertTrue(callable(getattr(a, name))) def test_dict_iter(self): d = self.dict()