Issue #25949: __dict__ for an OrderedDict instance is now created only when

needed.
This commit is contained in:
Serhiy Storchaka 2016-02-08 16:39:05 +02:00
parent 79ad897052
commit d2962f145a
3 changed files with 13 additions and 17 deletions

View File

@ -298,9 +298,11 @@ class OrderedDictTests:
# do not save instance dictionary if not needed
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
od = OrderedDict(pairs)
self.assertIsInstance(od.__dict__, dict)
self.assertIsNone(od.__reduce__()[2])
od.x = 10
self.assertIsNotNone(od.__reduce__()[2])
self.assertEqual(od.__dict__['x'], 10)
self.assertEqual(od.__reduce__()[2], {'x': 10})
def test_pickle_recursive(self):
OrderedDict = self.OrderedDict

View File

@ -170,6 +170,9 @@ Core and Builtins
Library
-------
- Issue #25949: __dict__ for an OrderedDict instance is now created only when
needed.
- Issue #25911: Restored support of bytes paths in os.walk() on Windows.
- Issue #26045: Add UTF-8 suggestion to error message when posting a

View File

@ -1424,14 +1424,13 @@ static PyMethodDef odict_methods[] = {
* OrderedDict members
*/
/* tp_members */
/* tp_getset */
static PyMemberDef odict_members[] = {
{"__dict__", T_OBJECT, offsetof(PyODictObject, od_inst_dict), READONLY},
{0}
static PyGetSetDef odict_getset[] = {
{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
{NULL}
};
/* ----------------------------------------------
* OrderedDict type slot methods
*/
@ -1653,20 +1652,12 @@ odict_init(PyObject *self, PyObject *args, PyObject *kwds)
static PyObject *
odict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *dict;
PyODictObject *od;
dict = PyDict_New();
if (dict == NULL)
return NULL;
od = (PyODictObject *)PyDict_Type.tp_new(type, args, kwds);
if (od == NULL) {
Py_DECREF(dict);
if (od == NULL)
return NULL;
}
od->od_inst_dict = dict;
/* type constructor fills the memory with zeros (see
PyType_GenericAlloc()), there is no need to set them to zero again */
if (_odict_resize(od) < 0) {
@ -1708,8 +1699,8 @@ PyTypeObject PyODict_Type = {
(getiterfunc)odict_iter, /* tp_iter */
0, /* tp_iternext */
odict_methods, /* tp_methods */
odict_members, /* tp_members */
0, /* tp_getset */
0, /* tp_members */
odict_getset, /* tp_getset */
&PyDict_Type, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */