Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 53d2c41

Browse files
committed
Issue #19414: Have the OrderedDict mark deleted links as unusable.
This gives an earlier and more visible failure if a link is deleted during iteration.
1 parent 71ac07f commit 53d2c41

3 files changed

Lines changed: 15 additions & 0 deletions

File tree

Lib/collections/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ def __delitem__(self, key, dict_delitem=dict.__delitem__):
9696
link_next = link.next
9797
link_prev.next = link_next
9898
link_next.prev = link_prev
99+
link.prev = None
100+
link.next = None
99101

100102
def __iter__(self):
101103
'od.__iter__() <==> iter(od)'

Lib/test/test_collections.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,6 +1193,16 @@ def test_iterators(self):
11931193
[t[1] for t in reversed(pairs)])
11941194
self.assertEqual(list(reversed(od.items())), list(reversed(pairs)))
11951195

1196+
def test_detect_deletion_during_iteration(self):
1197+
od = OrderedDict.fromkeys('abc')
1198+
it = iter(od)
1199+
key = next(it)
1200+
del od[key]
1201+
with self.assertRaises(Exception):
1202+
# Note, the exact exception raised is not guaranteed
1203+
# The only guarantee that the next() will not succeed
1204+
next(it)
1205+
11961206
def test_popitem(self):
11971207
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
11981208
shuffle(pairs)

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ Library
7373
Decimal.quantize() method in the Python version. It had never been
7474
present in the C version.
7575

76+
- Issue #19414: Have the OrderedDict mark deleted links as unusable.
77+
This gives an early failure if the link is deleted during iteration.
78+
7679
- Issue #21421: Add __slots__ to the MappingViews ABC.
7780
Patch by Josh Rosenberg.
7881

0 commit comments

Comments
 (0)