8000 bpo-34610: Fixed iterator of multiprocessing.managers.DictProxy. (GH-… · python/cpython@f35e4d5 · GitHub
[go: up one dir, main page]

Skip to content

Commit f35e4d5

Browse files
bpo-34610: Fixed iterator of multiprocessing.managers.DictProxy. (GH-9113)
(cherry picked from commit e0e5065) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent e536320 commit f35e4d5

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

Lib/multiprocessing/managers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1095,10 +1095,13 @@ def __imul__(self, value):
10951095

10961096

10971097
DictProxy = MakeProxyType('DictProxy', (
1098-
'__contains__', '__delitem__', '__getitem__', '__len__',
1098+
'__contains__', '__delitem__', '__getitem__', '__iter__', '__len__',
10991099
'__setitem__', 'clear', 'copy', 'get', 'has_key', 'items',
11001100
'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
11011101
))
1102+
DictProxy._method_to_typeid_ = {
1103+
'__iter__': 'Iterator',
1104+
}
11021105

11031106

11041107
ArrayProxy = MakeProxyType('ArrayProxy', (

Lib/test/_test_multiprocessing.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1813,6 +1813,16 @@ def test_list(self):
18131813
a.append('hello')
18141814
self.assertEqual(f[0][:], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello'])
18151815

1816+
def test_list_iter(self):
1817+
a = self.list(list(range(10)))
1818+
it = iter(a)
1819+
self.assertEqual(list(it), list(range(10)))
1820+
self.assertEqual(list(it), []) # exhausted
1821+
# list modified during iteration
1822+
it = iter(a)
1823+
a[0] = 100
1824+
self.assertEqual(next(it), 100)
1825+
18161826
def test_list_proxy_in_list(self):
18171827
a = self.list([self.list(range(3)) for _i in range(3)])
18181828
self.assertEqual([inner[:] for inner in a], [[0, 1, 2]] * 3)
@@ -1843,6 +1853,19 @@ def test_dict(self):
18431853
self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
18441854
self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
18451855

1856+
def test_dict_iter(self):
1857+
d = self.dict()
1858+
indices = list(range(65, 70))
1859+
for i in indices:
1860+
d[i] = chr(i)
1861+
it = iter(d)
1862+
self.assertEqual(list(it), indices)
1863+
self.assertEqual(list(it), []) # exhausted
1864+
# dictionary changed size during iteration
1865+
it = iter(d)
1866+
d.clear()
1867+
self.assertRaises(RuntimeError, next, it)
1868+
18461869
def test_dict_proxy_nested(self):
18471870
pets = self.dict(ferrets=2, hamsters=4)
18481871
supplies = self.dict(water=10, feed=3)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed iterator of :class:`multiprocessing.managers.DictProxy`.

0 commit comments

Comments
 (0)
0