[Python-checkins] cpython: Issue #19414: Have the OrderedDict mark deleted links as unusable.

raymond.hettinger python-checkins at python.org
Sun May 4 06:58:55 CEST 2014


http://hg.python.org/cpython/rev/a3c345ba3563
changeset:   90558:a3c345ba3563
user:        Raymond Hettinger <python at rcn.com>
date:        Sat May 03 21:58:45 2014 -0700
summary:
  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.

files:
  Lib/collections/__init__.py  |   2 ++
  Lib/test/test_collections.py |  10 ++++++++++
  Misc/NEWS                    |   3 +++
  3 files changed, 15 insertions(+), 0 deletions(-)


diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -96,6 +96,8 @@
         link_next = link.next
         link_prev.next = link_next
         link_next.prev = link_prev
+        link.prev = None
+        link.next = None
 
     def __iter__(self):
         'od.__iter__() <==> iter(od)'
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -1193,6 +1193,16 @@
                          [t[1] for t in reversed(pairs)])
         self.assertEqual(list(reversed(od.items())), list(reversed(pairs)))
 
+    def test_detect_deletion_during_iteration(self):
+        od = OrderedDict.fromkeys('abc')
+        it = iter(od)
+        key = next(it)
+        del od[key]
+        with self.assertRaises(Exception):
+            # Note, the exact exception raised is not guaranteed
+            # The only guarantee that the next() will not succeed
+            next(it)
+
     def test_popitem(self):
         pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
         shuffle(pairs)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -73,6 +73,9 @@
   Decimal.quantize() method in the Python version.  It had never been
   present in the C version.
 
+- Issue #19414: Have the OrderedDict mark deleted links as unusable.
+  This gives an early failure if the link is deleted during iteration.
+
 - Issue #21421: Add __slots__ to the MappingViews ABC.
   Patch by Josh Rosenberg.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list