summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-03-26 06:51:33 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-03-26 06:51:33 (GMT)
commitaa4c36fbbb47fe54d578cb7f04f53179360e5aa7 (patch)
treefae7bf62473c76949f1037bf1f3ca1d8c0358e69
parentf3fa308817a578c8809c70f6b24b1c489eeef803 (diff)
downloadcpython-aa4c36fbbb47fe54d578cb7f04f53179360e5aa7.zip
cpython-aa4c36fbbb47fe54d578cb7f04f53179360e5aa7.tar.gz
cpython-aa4c36fbbb47fe54d578cb7f04f53179360e5aa7.tar.bz2
Issue #23775: pprint() of OrderedDict now outputs the same representation
as repr().
-rw-r--r--Lib/pprint.py21
-rw-r--r--Lib/test/test_pprint.py40
-rw-r--r--Misc/NEWS3
3 files changed, 40 insertions, 24 deletions
diff --git a/Lib/pprint.py b/Lib/pprint.py
index fc5395e..c79c713 100644
--- a/Lib/pprint.py
+++ b/Lib/pprint.py
@@ -34,10 +34,10 @@ saferepr()
"""
+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 @@ class PrettyPrinter:
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
index 01e19fe..428e77e 100644
--- a/Lib/test/test_pprint.py
+++ b/Lib/test/test_pprint.py
@@ -272,19 +272,23 @@ class QueryTestCase(unittest.TestCase):
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 @@ mappingproxy({'a': 6,
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
index ef2dd3d..5fa6b72 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -30,6 +30,9 @@ Core and Builtins
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.