Skip to content

Commit

Permalink
pythongh-101446: Change repr of collections.OrderedDict
Browse files Browse the repository at this point in the history
  • Loading branch information
sobolevn committed Feb 7, 2023
1 parent f87f6e2 commit 92528bf
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 51 deletions.
2 changes: 1 addition & 1 deletion Lib/collections/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ def __repr__(self):
'od.__repr__() <==> repr(od)'
if not self:
return '%s()' % (self.__class__.__name__,)
return '%s(%r)' % (self.__class__.__name__, list(self.items()))
return '%s(%r)' % (self.__class__.__name__, dict(self.items()))

This comment has been minimized.

Copy link
@pochmann

pochmann Feb 8, 2023

Can't this just use dict(self)?


def __reduce__(self):
'Return state information for pickling'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Change repr of :class:`collections.OrderedDict` to use regular dictionary
formating instead of pair of keys and values.
53 changes: 3 additions & 50 deletions Objects/odictobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1367,7 +1367,7 @@ static PyObject *
odict_repr(PyODictObject *self)
{
int i;
PyObject *pieces = NULL, *result = NULL;
PyObject *result = NULL;

if (PyODict_SIZE(self) == 0)
return PyUnicode_FromFormat("%s()", _PyType_Name(Py_TYPE(self)));
Expand All @@ -1377,57 +1377,10 @@ odict_repr(PyODictObject *self)
return i > 0 ? PyUnicode_FromString("...") : NULL;
}

if (PyODict_CheckExact(self)) {
Py_ssize_t count = 0;
_ODictNode *node;
pieces = PyList_New(PyODict_SIZE(self));
if (pieces == NULL)
goto Done;

_odict_FOREACH(self, node) {
PyObject *pair;
PyObject *key = _odictnode_KEY(node);
PyObject *value = _odictnode_VALUE(node, self);
if (value == NULL) {
if (!PyErr_Occurred())
PyErr_SetObject(PyExc_KeyError, key);
goto Done;
}
pair = PyTuple_Pack(2, key, value);
if (pair == NULL)
goto Done;

if (count < PyList_GET_SIZE(pieces))
PyList_SET_ITEM(pieces, count, pair); /* steals reference */
else {
if (PyList_Append(pieces, pair) < 0) {
Py_DECREF(pair);
goto Done;
}
Py_DECREF(pair);
}
count++;
}
if (count < PyList_GET_SIZE(pieces)) {
Py_SET_SIZE(pieces, count);
}
}
else {
PyObject *items = PyObject_CallMethodNoArgs(
(PyObject *)self, &_Py_ID(items));
if (items == NULL)
goto Done;
pieces = PySequence_List(items);
Py_DECREF(items);
if (pieces == NULL)
goto Done;
}

result = PyUnicode_FromFormat("%s(%R)",
_PyType_Name(Py_TYPE(self)), pieces);
_PyType_Name(Py_TYPE(self)),
PyDict_Copy((PyObject *)self));

Done:
Py_XDECREF(pieces);
Py_ReprLeave((PyObject *)self);
return result;
}
Expand Down

0 comments on commit 92528bf

Please sign in to comment.