Skip to content

Commit df129f0

Browse files
invisibleroadsestyxx
authored andcommitted
pythongh-103134: Update multiprocessing.managers.ListProxy and DictProxy (pythonGH-103133)
1 parent 2cdfe1f commit df129f0

File tree

3 files changed

+60
-10
lines changed

3 files changed

+60
-10
lines changed

Lib/multiprocessing/managers.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -1152,10 +1152,10 @@ def set(self, value):
11521152

11531153

11541154
BaseListProxy = MakeProxyType('BaseListProxy', (
1155-
'__add__', '__contains__', '__delitem__', '__getitem__', '__len__',
1156-
'__mul__', '__reversed__', '__rmul__', '__setitem__',
1157-
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
1158-
'reverse', 'sort', '__imul__'
1155+
'__add__', '__contains__', '__delitem__', '__getitem__', '__imul__',
1156+
'__len__', '__mul__', '__reversed__', '__rmul__', '__setitem__',
1157+
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',
1158+
'remove', 'reverse', 'sort',
11591159
))
11601160
class ListProxy(BaseListProxy):
11611161
def __iadd__(self, value):
@@ -1169,16 +1169,20 @@ def __imul__(self, value):
11691169

11701170

11711171
_BaseDictProxy = MakeProxyType('DictProxy', (
1172-
'__contains__', '__delitem__', '__getitem__', '__iter__', '__len__',
1173-
'__setitem__', 'clear', 'copy', 'get', 'items',
1172+
'__contains__', '__delitem__', '__getitem__', '__ior__', '__iter__',
1173+
'__len__', '__or__', '__reversed__', '__ror__',
1174+
'__setitem__', 'clear', 'copy', 'fromkeys', 'get', 'items',
11741175
'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
11751176
))
11761177
_BaseDictProxy._method_to_typeid_ = {
11771178
'__iter__': 'Iterator',
11781179
}
11791180
class DictProxy(_BaseDictProxy):
1180-
__class_getitem__ = classmethod(types.GenericAlias)
1181+
def __ior__(self, value):
1182+
self._callmethod('__ior__', (value,))
1183+
return self
11811184

1185+
__class_getitem__ = classmethod(types.GenericAlias)
11821186

11831187
ArrayProxy = MakeProxyType('ArrayProxy', (
11841188
'__len__', '__getitem__', '__setitem__'

Lib/test/_test_multiprocessing.py

+43-3
Original file line numberDiff line numberDiff line change
@@ -6064,12 +6064,30 @@ def _test_list(cls, obj):
60646064
case.assertEqual(obj[0], 5)
60656065
case.assertEqual(obj.count(5), 1)
60666066
case.assertEqual(obj.index(5), 0)
6067+
obj += [7]
6068+
case.assertIsInstance(obj, multiprocessing.managers.ListProxy)
6069+
case.assertListEqual(list(obj), [5, 7])
6070+
obj *= 2
6071+
case.assertIsInstance(obj, multiprocessing.managers.ListProxy)
6072+
case.assertListEqual(list(obj), [5, 7, 5, 7])
6073+
double_obj = obj * 2
6074+
case.assertIsInstance(double_obj, list)
6075+
case.assertListEqual(list(double_obj), [5, 7, 5, 7, 5, 7, 5, 7])
6076+
double_obj = 2 * obj
6077+
case.assertIsInstance(double_obj, list)
6078+
case.assertListEqual(list(double_obj), [5, 7, 5, 7, 5, 7, 5, 7])
6079+
copied_obj = obj.copy()
6080+
case.assertIsInstance(copied_obj, list)
6081+
case.assertListEqual(list(copied_obj), [5, 7, 5, 7])
6082+
obj.extend(double_obj + copied_obj)
60676083
obj.sort()
60686084
obj.reverse()
60696085
for x in obj:
60706086
pass
6071-
case.assertEqual(len(obj), 1)
6072-
case.assertEqual(obj.pop(0), 5)
6087+
case.assertEqual(len(obj), 16)
6088+
case.assertEqual(obj.pop(0), 7)
6089+
obj.clear()
6090+
case.assertEqual(len(obj), 0)
60736091

60746092
def test_list(self):
60756093
o = self.manager.list()
@@ -6088,7 +6106,29 @@ def _test_dict(cls, obj):
60886106
case.assertListEqual(list(obj.keys()), ['foo'])
60896107
case.assertListEqual(list(obj.values()), [5])
60906108
case.assertDictEqual(obj.copy(), {'foo': 5})
6091-
case.assertTupleEqual(obj.popitem(), ('foo', 5))
6109+
obj |= {'bar': 6}
6110+
case.assertIsInstance(obj, multiprocessing.managers.DictProxy)
6111+
case.assertDictEqual(dict(obj), {'foo': 5, 'bar': 6})
6112+
x = reversed(obj)
6113+
case.assertIsInstance(x, type(iter([])))
6114+
case.assertListEqual(list(x), ['bar', 'foo'])
6115+
x = {'bar': 7, 'baz': 7} | obj
6116+
case.assertIsInstance(x, dict)
6117+
case.assertDictEqual(dict(x), {'foo': 5, 'bar': 6, 'baz': 7})
6118+
x = obj | {'bar': 7, 'baz': 7}
6119+
case.assertIsInstance(x, dict)
6120+
case.assertDictEqual(dict(x), {'foo': 5, 'bar': 7, 'baz': 7})
6121+
x = obj.fromkeys(['bar'], 6)
6122+
case.assertIsInstance(x, dict)
6123+
case.assertDictEqual(x, {'bar': 6})
6124+
x = obj.popitem()
6125+
case.assertIsInstance(x, tuple)
6126+
case.assertTupleEqual(x, ('bar', 6))
6127+
obj.setdefault('bar', 0)
6128+
obj.update({'bar': 7})
6129+
case.assertEqual(obj.pop('bar'), 7)
6130+
obj.clear()
6131+
case.assertEqual(len(obj), 0)
60926132

60936133
def test_dict(self):
60946134
o = self.manager.dict()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Add additional methods to :ref:`proxy objects <multiprocessing-proxy_objects>`
2+
in the :mod:`!multiprocessing` module:
3+
4+
* :meth:`!clear` and :meth:`!copy` for proxies of :class:`list`
5+
* :meth:`~dict.fromkeys`, ``reversed(d)``, ``d | {}``, ``{} | d``,
6+
``d |= {'b': 2}`` for proxies of :class:`dict`

0 commit comments

Comments
 (0)