[Python-checkins] gh-101446: Change `repr` of `collections.OrderedDict` (#101661)
rhettinger
webhook-mailer at python.org
Tue Feb 7 21:01:16 EST 2023
https://github.com/python/cpython/commit/790ff6bc6a56b4bd6e403aa43a984b99f7171dd7
commit: 790ff6bc6a56b4bd6e403aa43a984b99f7171dd7
branch: main
author: Nikita Sobolev <mail at sobolevn.me>
committer: rhettinger <rhettinger at users.noreply.github.com>
date: 2023-02-07T20:01:10-06:00
summary:
gh-101446: Change `repr` of `collections.OrderedDict` (#101661)
files:
A Misc/NEWS.d/next/Library/2023-02-07-22-21-46.gh-issue-101446.-c0FdK.rst
M Lib/collections/__init__.py
M Lib/test/test_ordered_dict.py
M Objects/odictobject.c
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
index b5e4d16e9dbc..a5393aad4249 100644
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -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()))
def __reduce__(self):
'Return state information for pickling'
diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py
index 37447fd249b8..decbcc2419c9 100644
--- a/Lib/test/test_ordered_dict.py
+++ b/Lib/test/test_ordered_dict.py
@@ -362,7 +362,7 @@ def test_repr(self):
OrderedDict = self.OrderedDict
od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])
self.assertEqual(repr(od),
- "OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])")
+ "OrderedDict({'c': 1, 'b': 2, 'a': 3, 'd': 4, 'e': 5, 'f': 6})")
self.assertEqual(eval(repr(od)), od)
self.assertEqual(repr(OrderedDict()), "OrderedDict()")
@@ -372,7 +372,7 @@ def test_repr_recursive(self):
od = OrderedDict.fromkeys('abc')
od['x'] = od
self.assertEqual(repr(od),
- "OrderedDict([('a', None), ('b', None), ('c', None), ('x', ...)])")
+ "OrderedDict({'a': None, 'b': None, 'c': None, 'x': ...})")
def test_repr_recursive_values(self):
OrderedDict = self.OrderedDict
diff --git a/Misc/NEWS.d/next/Library/2023-02-07-22-21-46.gh-issue-101446.-c0FdK.rst b/Misc/NEWS.d/next/Library/2023-02-07-22-21-46.gh-issue-101446.-c0FdK.rst
new file mode 100644
index 000000000000..ddf897b71bb1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-02-07-22-21-46.gh-issue-101446.-c0FdK.rst
@@ -0,0 +1,2 @@
+Change repr of :class:`collections.OrderedDict` to use regular dictionary
+formating instead of pairs of keys and values.
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index 4976b70b5dff..ab2bbed35873 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -1367,7 +1367,7 @@ static PyObject *
odict_repr(PyODictObject *self)
{
int i;
- PyObject *pieces = NULL, *result = NULL;
+ PyObject *result = NULL, *dcopy = NULL;
if (PyODict_SIZE(self) == 0)
return PyUnicode_FromFormat("%s()", _PyType_Name(Py_TYPE(self)));
@@ -1377,57 +1377,16 @@ 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;
+ dcopy = PyDict_Copy((PyObject *)self);
+ if (dcopy == NULL) {
+ goto Done;
}
result = PyUnicode_FromFormat("%s(%R)",
- _PyType_Name(Py_TYPE(self)), pieces);
+ _PyType_Name(Py_TYPE(self)),
+ dcopy);
Done:
- Py_XDECREF(pieces);
Py_ReprLeave((PyObject *)self);
return result;
}
More information about the Python-checkins
mailing list