[Python-checkins] cpython: Issue #23775: pprint() of OrderedDict now outputs the same representation

serhiy.storchaka python-checkins at python.org
Thu Mar 26 07:52:10 CET 2015


https://hg.python.org/cpython/rev/afc21da5935f
changeset:   95210:afc21da5935f
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Thu Mar 26 08:51:33 2015 +0200
summary:
  Issue #23775: pprint() of OrderedDict now outputs the same representation
as repr().

files:
  Lib/pprint.py           |  21 ++++++++++----
  Lib/test/test_pprint.py |  40 +++++++++++++++-------------
  Misc/NEWS               |   3 ++
  3 files changed, 40 insertions(+), 24 deletions(-)


diff --git a/Lib/pprint.py b/Lib/pprint.py
--- a/Lib/pprint.py
+++ b/Lib/pprint.py
@@ -34,10 +34,10 @@
 
 """
 
+import collections as _collections
 import re
 import sys as _sys
 import types as _types
-from collections import OrderedDict as _OrderedDict
 from io import StringIO as _StringIO
 
 __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr",
@@ -188,16 +188,25 @@
             write((self._indent_per_level - 1) * ' ')
         length = len(object)
         if length:
-            if isinstance(object, _OrderedDict):
-                items = list(object.items())
-            else:
-                items = sorted(object.items(), key=_safe_tuple)
+            items = sorted(object.items(), key=_safe_tuple)
             self._format_dict_items(items, stream, indent, allowance + 1,
                                     context, level)
         write('}')
 
     _dispatch[dict.__repr__] = _pprint_dict
-    _dispatch[_OrderedDict.__repr__] = _pprint_dict
+
+    def _pprint_ordered_dict(self, object, stream, indent, allowance, context, level):
+        if not len(object):
+            stream.write(repr(object))
+            return
+        cls = object.__class__
+        stream.write(cls.__name__ + '(')
+        self._format(list(object.items()), stream,
+                     indent + len(cls.__name__) + 1, allowance + 1,
+                     context, level)
+        stream.write(')')
+
+    _dispatch[_collections.OrderedDict.__repr__] = _pprint_ordered_dict
 
     def _pprint_list(self, object, stream, indent, allowance, context, level):
         stream.write('[')
diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py
--- a/Lib/test/test_pprint.py
+++ b/Lib/test/test_pprint.py
@@ -272,19 +272,23 @@
             r"{5: [[]], 'xy\tab\n': (3,), (): {}}")
 
     def test_ordered_dict(self):
+        d = collections.OrderedDict()
+        self.assertEqual(pprint.pformat(d, width=1), 'OrderedDict()')
+        d = collections.OrderedDict([])
+        self.assertEqual(pprint.pformat(d, width=1), 'OrderedDict()')
         words = 'the quick brown fox jumped over a lazy dog'.split()
         d = collections.OrderedDict(zip(words, itertools.count()))
         self.assertEqual(pprint.pformat(d),
 """\
-{'the': 0,
- 'quick': 1,
- 'brown': 2,
- 'fox': 3,
- 'jumped': 4,
- 'over': 5,
- 'a': 6,
- 'lazy': 7,
- 'dog': 8}""")
+OrderedDict([('the', 0),
+             ('quick', 1),
+             ('brown', 2),
+             ('fox', 3),
+             ('jumped', 4),
+             ('over', 5),
+             ('a', 6),
+             ('lazy', 7),
+             ('dog', 8)])""")
 
     def test_mapping_proxy(self):
         words = 'the quick brown fox jumped over a lazy dog'.split()
@@ -303,15 +307,15 @@
         d = collections.OrderedDict(zip(words, itertools.count()))
         m = types.MappingProxyType(d)
         self.assertEqual(pprint.pformat(m), """\
-mappingproxy({'the': 0,
-              'quick': 1,
-              'brown': 2,
-              'fox': 3,
-              'jumped': 4,
-              'over': 5,
-              'a': 6,
-              'lazy': 7,
-              'dog': 8})""")
+mappingproxy(OrderedDict([('the', 0),
+                          ('quick', 1),
+                          ('brown', 2),
+                          ('fox', 3),
+                          ('jumped', 4),
+                          ('over', 5),
+                          ('a', 6),
+                          ('lazy', 7),
+                          ('dog', 8)]))""")
 
     def test_subclassing(self):
         o = {'names with spaces': 'should be presented using repr()',
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -30,6 +30,9 @@
 Library
 -------
 
+- Issue #23775: pprint() of OrderedDict now outputs the same representation
+  as repr().
+
 - Issue #23765: Removed IsBadStringPtr calls in ctypes
 
 - Issue #22364: Improved some re error messages using regex for hints.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list