https://github.com/python/cpython/commit/bbb49888a752869ae93423c42039a3a8dfab34d4
commit: bbb49888a752869ae93423c42039a3a8dfab34d4
branch: main
author: Roy Hyunjin Han <[email protected]>
committer: encukou <[email protected]>
date: 2024-05-20T14:28:36Z
summary:
gh-103134: Update multiprocessing.managers.ListProxy and DictProxy (GH-103133)
files:
A Misc/NEWS.d/next/Library/2023-03-30-18-19-53.gh-issue-103134.bHrn91.rst
M Lib/multiprocessing/managers.py
M Lib/test/_test_multiprocessing.py
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py
index 76b915de74d94e..0f5f9f64c2de9e 100644
--- a/Lib/multiprocessing/managers.py
+++ b/Lib/multiprocessing/managers.py
@@ -1152,10 +1152,10 @@ def set(self, value):
BaseListProxy = MakeProxyType('BaseListProxy', (
- '__add__', '__contains__', '__delitem__', '__getitem__', '__len__',
- '__mul__', '__reversed__', '__rmul__', '__setitem__',
- 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
- 'reverse', 'sort', '__imul__'
+ '__add__', '__contains__', '__delitem__', '__getitem__', '__imul__',
+ '__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__',
+ 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',
+ 'remove', 'reverse', 'sort',
))
class ListProxy(BaseListProxy):
def __iadd__(self, value):
@@ -1169,16 +1169,20 @@ def __imul__(self, value):
_BaseDictProxy = MakeProxyType('DictProxy', (
- '__contains__', '__delitem__', '__getitem__', '__iter__', '__len__',
- '__setitem__', 'clear', 'copy', 'get', 'items',
+ '__contains__', '__delitem__', '__getitem__', '__ior__', '__iter__',
+ '__len__', '__or__', '__reversed__', '__ror__',
+ '__setitem__', 'clear', 'copy', 'fromkeys', 'get', 'items',
'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
))
_BaseDictProxy._method_to_typeid_ = {
'__iter__': 'Iterator',
}
class DictProxy(_BaseDictProxy):
- __class_getitem__ = classmethod(types.GenericAlias)
+ def __ior__(self, value):
+ self._callmethod('__ior__', (value,))
+ return self
+ __class_getitem__ = classmethod(types.GenericAlias)
ArrayProxy = MakeProxyType('ArrayProxy', (
'__len__', '__getitem__', '__setitem__'
diff --git a/Lib/test/_test_multiprocessing.py
b/Lib/test/_test_multiprocessing.py
index f126b6745dc83b..301541a666e140 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -6064,12 +6064,30 @@ def _test_list(cls, obj):
case.assertEqual(obj[0], 5)
case.assertEqual(obj.count(5), 1)
case.assertEqual(obj.index(5), 0)
+ obj += [7]
+ case.assertIsInstance(obj, multiprocessing.managers.ListProxy)
+ case.assertListEqual(list(obj), [5, 7])
+ obj *= 2
+ case.assertIsInstance(obj, multiprocessing.managers.ListProxy)
+ case.assertListEqual(list(obj), [5, 7, 5, 7])
+ double_obj = obj * 2
+ case.assertIsInstance(double_obj, list)
+ case.assertListEqual(list(double_obj), [5, 7, 5, 7, 5, 7, 5, 7])
+ double_obj = 2 * obj
+ case.assertIsInstance(double_obj, list)
+ case.assertListEqual(list(double_obj), [5, 7, 5, 7, 5, 7, 5, 7])
+ copied_obj = obj.copy()
+ case.assertIsInstance(copied_obj, list)
+ case.assertListEqual(list(copied_obj), [5, 7, 5, 7])
+ obj.extend(double_obj + copied_obj)
obj.sort()
obj.reverse()
for x in obj:
pass
- case.assertEqual(len(obj), 1)
- case.assertEqual(obj.pop(0), 5)
+ case.assertEqual(len(obj), 16)
+ case.assertEqual(obj.pop(0), 7)
+ obj.clear()
+ case.assertEqual(len(obj), 0)
def test_list(self):
o = self.manager.list()
@@ -6088,7 +6106,29 @@ def _test_dict(cls, obj):
case.assertListEqual(list(obj.keys()), ['foo'])
case.assertListEqual(list(obj.values()), [5])
case.assertDictEqual(obj.copy(), {'foo': 5})
- case.assertTupleEqual(obj.popitem(), ('foo', 5))
+ obj |= {'bar': 6}
+ case.assertIsInstance(obj, multiprocessing.managers.DictProxy)
+ case.assertDictEqual(dict(obj), {'foo': 5, 'bar': 6})
+ x = reversed(obj)
+ case.assertIsInstance(x, type(iter([])))
+ case.assertListEqual(list(x), ['bar', 'foo'])
+ x = {'bar': 7, 'baz': 7} | obj
+ case.assertIsInstance(x, dict)
+ case.assertDictEqual(dict(x), {'foo': 5, 'bar': 6, 'baz': 7})
+ x = obj | {'bar': 7, 'baz': 7}
+ case.assertIsInstance(x, dict)
+ case.assertDictEqual(dict(x), {'foo': 5, 'bar': 7, 'baz': 7})
+ x = obj.fromkeys(['bar'], 6)
+ case.assertIsInstance(x, dict)
+ case.assertDictEqual(x, {'bar': 6})
+ x = obj.popitem()
+ case.assertIsInstance(x, tuple)
+ case.assertTupleEqual(x, ('bar', 6))
+ obj.setdefault('bar', 0)
+ obj.update({'bar': 7})
+ case.assertEqual(obj.pop('bar'), 7)
+ obj.clear()
+ case.assertEqual(len(obj), 0)
def test_dict(self):
o = self.manager.dict()
diff --git
a/Misc/NEWS.d/next/Library/2023-03-30-18-19-53.gh-issue-103134.bHrn91.rst
b/Misc/NEWS.d/next/Library/2023-03-30-18-19-53.gh-issue-103134.bHrn91.rst
new file mode 100644
index 00000000000000..11559dce0ae2b4
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-03-30-18-19-53.gh-issue-103134.bHrn91.rst
@@ -0,0 +1,6 @@
+Add additional methods to :ref:`proxy objects <multiprocessing-proxy_objects>`
+in the :mod:`!multiprocessing` module:
+
+* :meth:`!clear` and :meth:`!copy` for proxies of :class:`list`
+* :meth:`~dict.fromkeys`, ``reversed(d)``, ``d | {}``, ``{} | d``,
+ ``d |= {'b': 2}`` for proxies of :class:`dict`
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]