diff options
author | Raymond Hettinger <python@rcn.com> | 2010-09-09 12:31:00 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2010-09-09 12:31:00 (GMT) |
commit | bad3c88094f43f3bc7dcce22f47b8c2a8dddabcf (patch) | |
tree | e315bcea2939b788711b87a7a9595cddfa7f0281 | |
parent | a0e79408bcf14015995fb4f1f1c3ad88df017496 (diff) | |
download | cpython-bad3c88094f43f3bc7dcce22f47b8c2a8dddabcf.zip cpython-bad3c88094f43f3bc7dcce22f47b8c2a8dddabcf.tar.gz cpython-bad3c88094f43f3bc7dcce22f47b8c2a8dddabcf.tar.bz2 |
Have pprint() respect the order in an OrderedDict.
-rw-r--r-- | Lib/pprint.py | 9 | ||||
-rw-r--r-- | Lib/test/test_pprint.py | 16 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 25 insertions, 3 deletions
diff --git a/Lib/pprint.py b/Lib/pprint.py index b3a6446..b8417f5 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 ad3a193..1a38ece 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'} @@ -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. |