Merge from 3.5.

This commit is contained in:
Serhiy Storchaka 2016-10-30 17:25:45 +02:00
commit b7d14a09c2
3 changed files with 22 additions and 69 deletions

View File

@ -775,64 +775,5 @@ class CPythonSubclassMappingTests(mapping_tests.BasicTestMappingProtocol):
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
@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()

View File

@ -31,9 +31,6 @@ Core and Builtins
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.

View File

@ -1102,6 +1102,7 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj,
}
/* Now delete the value from the dict. */
if (PyODict_CheckExact(od)) {
if (node != NULL) {
value = _PyDict_GetItem_KnownHash(od, key, hash); /* borrowed */
if (value != NULL) {
@ -1112,6 +1113,20 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj,
}
}
}
}
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);
}
}
}
}
/* Apply the fallback value, if necessary. */
if (value == NULL && !PyErr_Occurred()) {