From bad3c88094f43f3bc7dcce22f47b8c2a8dddabcf Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 9 Sep 2010 12:31:00 +0000 Subject: [PATCH] Have pprint() respect the order in an OrderedDict. --- Lib/pprint.py | 9 ++++++--- Lib/test/test_pprint.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Lib/pprint.py b/Lib/pprint.py index b3a644649e5..b8417f59225 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -35,7 +35,7 @@ saferepr() """ import sys as _sys - +from collections import OrderedDict as _OrderedDict from io import StringIO as _StringIO __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr", @@ -163,7 +163,7 @@ class PrettyPrinter: if sepLines: r = getattr(typ, "__repr__", None) - if issubclass(typ, dict) and r is dict.__repr__: + if issubclass(typ, dict): write('{') if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ') @@ -171,7 +171,10 @@ class PrettyPrinter: if length: context[objid] = 1 indent = indent + self._indent_per_level - items = sorted(object.items(), key=_safe_tuple) + if issubclass(typ, _OrderedDict): + items = list(object.items()) + else: + items = sorted(object.items(), key=_safe_tuple) key, ent = items[0] rep = self._repr(key, context, level) write(rep) diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index ad3a19396a8..1a38ece60b0 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -3,6 +3,8 @@ import test.support import unittest import test.test_set import random +import collections +import itertools # list, tuple and dict subclasses that do or don't overwrite __repr__ class list2(list): @@ -195,6 +197,20 @@ class QueryTestCase(unittest.TestCase): self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}), r"{5: [[]], 'xy\tab\n': (3,), (): {}}") + def test_ordered_dict(self): + 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}""") def test_subclassing(self): o = {'names with spaces': 'should be presented using repr()', 'others.should.not.be': 'like.this'} diff --git a/Misc/NEWS b/Misc/NEWS index 148ee791d47..0849bd900c0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,9 @@ Core and Builtins Library ------- +- The pprint module now supports printing OrderedDicts in their given + order (formerly, it would sort the keys). + - Logging: Added QueueHandler class to facilitate logging usage with multiprocessing.