From aa4c36fbbb47fe54d578cb7f04f53179360e5aa7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 26 Mar 2015 08:51:33 +0200 Subject: Issue #23775: pprint() of OrderedDict now outputs the same representation as repr(). --- 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 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. -- cgit v0.12