[Python-checkins] cpython (merge 3.5 -> 3.6): Merge from 3.5.

serhiy.storchaka python-checkins at python.org
Sun Oct 30 11:28:05 EDT 2016


https://hg.python.org/cpython/rev/e7b768717074
changeset:   104818:e7b768717074
branch:      3.6
parent:      104812:a0d272fbc7de
parent:      104817:3f816eecc53e
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun Oct 30 17:25:45 2016 +0200
summary:
  Merge from 3.5.

files:
  Lib/test/test_ordered_dict.py |  59 -----------------------
  Misc/NEWS                     |   3 -
  Objects/odictobject.c         |  29 ++++++++--
  3 files changed, 22 insertions(+), 69 deletions(-)


diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py
--- a/Lib/test/test_ordered_dict.py
+++ b/Lib/test/test_ordered_dict.py
@@ -775,64 +775,5 @@
         self.assertRaises(KeyError, d.popitem)
 
 
-class SimpleLRUCache:
-
-    def __init__(self, size):
-        super().__init__()
-        self.size = size
-
-    def __getitem__(self, item):
-        value = super().__getitem__(item)
-        self.move_to_end(item)
-        return value
-
-    def __setitem__(self, key, value):
-        while key not in self and len(self) >= self.size:
-            self.popitem(last=False)
-        super().__setitem__(key, value)
-        self.move_to_end(key)
-
-
-class SimpleLRUCacheTests:
-
-    def test_add_after_full(self):
-        c = self.type2test(2)
-        c['t1'] = 1
-        c['t2'] = 2
-        c['t3'] = 3
-        self.assertEqual(list(c), ['t2', 't3'])
-
-    def test_popitem(self):
-        c = self.type2test(3)
-        for i in range(1, 4):
-            c[i] = i
-        self.assertEqual(c.popitem(last=False), (1, 1))
-        self.assertEqual(c.popitem(last=True), (3, 3))
-
-    def test_change_order_on_get(self):
-        c = self.type2test(3)
-        for i in range(1, 4):
-            c[i] = i
-        self.assertEqual(list(c), list(range(1, 4)))
-        self.assertEqual(c[2], 2)
-        self.assertEqual(list(c), [1, 3, 2])
-
-
-class PySimpleLRUCacheTests(SimpleLRUCacheTests, unittest.TestCase):
-
-    class type2test(SimpleLRUCache, py_coll.OrderedDict):
-        pass
-
-
- at unittest.skipUnless(c_coll, 'requires the C version of the collections module')
-class CSimpleLRUCacheTests(SimpleLRUCacheTests, unittest.TestCase):
-
-    @classmethod
-    def setUpClass(cls):
-        class type2test(SimpleLRUCache, c_coll.OrderedDict):
-            pass
-        cls.type2test = type2test
-
-
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -31,9 +31,6 @@
 Library
 -------
 
-- Issue #27275: Fixed implementation of pop() and popitem() methods in
-  subclasses of accelerated OrderedDict.
-
 - Issue #18844: The various ways of specifing weights for random.choices()
   now produce the same result sequences.
 
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -1102,13 +1102,28 @@
     }
 
     /* Now delete the value from the dict. */
-    if (node != NULL) {
-        value = _PyDict_GetItem_KnownHash(od, key, hash);  /* borrowed */
-        if (value != NULL) {
-            Py_INCREF(value);
-            if (_PyDict_DelItem_KnownHash(od, key, hash) < 0) {
-                Py_DECREF(value);
-                return NULL;
+    if (PyODict_CheckExact(od)) {
+        if (node != NULL) {
+            value = _PyDict_GetItem_KnownHash(od, key, hash);  /* borrowed */
+            if (value != NULL) {
+                Py_INCREF(value);
+                if (_PyDict_DelItem_KnownHash(od, key, hash) < 0) {
+                    Py_DECREF(value);
+                    return NULL;
+                }
+            }
+        }
+    }
+    else {
+        int exists = PySequence_Contains(od, key);
+        if (exists < 0)
+            return NULL;
+        if (exists) {
+            value = PyObject_GetItem(od, key);
+            if (value != NULL) {
+                if (PyObject_DelItem(od, key) == -1) {
+                    Py_CLEAR(value);
+                }
             }
         }
     }

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


More information about the Python-checkins mailing list