mirror of
https://github.com/python/cpython.git
synced 2024-12-04 23:34:42 +08:00
Merge from 3.6.
This commit is contained in:
commit
a182d7bc14
@ -775,64 +775,5 @@ class CPythonSubclassMappingTests(mapping_tests.BasicTestMappingProtocol):
|
|||||||
self.assertRaises(KeyError, d.popitem)
|
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__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -99,9 +99,6 @@ Core and Builtins
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
- Issue #27275: Fixed implementation of pop() and popitem() methods in
|
|
||||||
subclasses of accelerated OrderedDict.
|
|
||||||
|
|
||||||
- Issue #28255: calendar.TextCalendar.prweek() no longer prints a space after
|
- Issue #28255: calendar.TextCalendar.prweek() no longer prints a space after
|
||||||
a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant
|
a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant
|
||||||
newline after a year's calendar. Based on patch by Xiang Zhang.
|
newline after a year's calendar. Based on patch by Xiang Zhang.
|
||||||
|
@ -1102,13 +1102,28 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now delete the value from the dict. */
|
/* Now delete the value from the dict. */
|
||||||
if (node != NULL) {
|
if (PyODict_CheckExact(od)) {
|
||||||
value = _PyDict_GetItem_KnownHash(od, key, hash); /* borrowed */
|
if (node != NULL) {
|
||||||
if (value != NULL) {
|
value = _PyDict_GetItem_KnownHash(od, key, hash); /* borrowed */
|
||||||
Py_INCREF(value);
|
if (value != NULL) {
|
||||||
if (_PyDict_DelItem_KnownHash(od, key, hash) < 0) {
|
Py_INCREF(value);
|
||||||
Py_DECREF(value);
|
if (_PyDict_DelItem_KnownHash(od, key, hash) < 0) {
|
||||||
return NULL;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user