Issue #23775: pprint() of OrderedDict now outputs the same representation

as repr().
This commit is contained in:
Serhiy Storchaka 2015-03-26 08:51:33 +02:00
parent f3fa308817
commit aa4c36fbbb
3 changed files with 40 additions and 24 deletions

View File

@ -34,10 +34,10 @@ saferepr()
""" """
import collections as _collections
import re import re
import sys as _sys import sys as _sys
import types as _types import types as _types
from collections import OrderedDict as _OrderedDict
from io import StringIO as _StringIO from io import StringIO as _StringIO
__all__ = ["pprint","pformat","isreadable","isrecursive","saferepr", __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr",
@ -188,16 +188,25 @@ class PrettyPrinter:
write((self._indent_per_level - 1) * ' ') write((self._indent_per_level - 1) * ' ')
length = len(object) length = len(object)
if length: 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, self._format_dict_items(items, stream, indent, allowance + 1,
context, level) context, level)
write('}') write('}')
_dispatch[dict.__repr__] = _pprint_dict _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): def _pprint_list(self, object, stream, indent, allowance, context, level):
stream.write('[') stream.write('[')

View File

@ -272,19 +272,23 @@ class QueryTestCase(unittest.TestCase):
r"{5: [[]], 'xy\tab\n': (3,), (): {}}") r"{5: [[]], 'xy\tab\n': (3,), (): {}}")
def test_ordered_dict(self): 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() words = 'the quick brown fox jumped over a lazy dog'.split()
d = collections.OrderedDict(zip(words, itertools.count())) d = collections.OrderedDict(zip(words, itertools.count()))
self.assertEqual(pprint.pformat(d), self.assertEqual(pprint.pformat(d),
"""\ """\
{'the': 0, OrderedDict([('the', 0),
'quick': 1, ('quick', 1),
'brown': 2, ('brown', 2),
'fox': 3, ('fox', 3),
'jumped': 4, ('jumped', 4),
'over': 5, ('over', 5),
'a': 6, ('a', 6),
'lazy': 7, ('lazy', 7),
'dog': 8}""") ('dog', 8)])""")
def test_mapping_proxy(self): def test_mapping_proxy(self):
words = 'the quick brown fox jumped over a lazy dog'.split() 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())) d = collections.OrderedDict(zip(words, itertools.count()))
m = types.MappingProxyType(d) m = types.MappingProxyType(d)
self.assertEqual(pprint.pformat(m), """\ self.assertEqual(pprint.pformat(m), """\
mappingproxy({'the': 0, mappingproxy(OrderedDict([('the', 0),
'quick': 1, ('quick', 1),
'brown': 2, ('brown', 2),
'fox': 3, ('fox', 3),
'jumped': 4, ('jumped', 4),
'over': 5, ('over', 5),
'a': 6, ('a', 6),
'lazy': 7, ('lazy', 7),
'dog': 8})""") ('dog', 8)]))""")
def test_subclassing(self): def test_subclassing(self):
o = {'names with spaces': 'should be presented using repr()', o = {'names with spaces': 'should be presented using repr()',

View File

@ -30,6 +30,9 @@ Core and Builtins
Library Library
------- -------
- Issue #23775: pprint() of OrderedDict now outputs the same representation
as repr().
- Issue #23765: Removed IsBadStringPtr calls in ctypes - Issue #23765: Removed IsBadStringPtr calls in ctypes
- Issue #22364: Improved some re error messages using regex for hints. - Issue #22364: Improved some re error messages using regex for hints.