Have pprint() respect the order in an OrderedDict.

This commit is contained in:
Raymond Hettinger 2010-09-09 12:31:00 +00:00
parent a0e79408bc
commit bad3c88094
3 changed files with 25 additions and 3 deletions

View File

@ -35,7 +35,7 @@ saferepr()
""" """
import sys as _sys import sys as _sys
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",
@ -163,7 +163,7 @@ class PrettyPrinter:
if sepLines: if sepLines:
r = getattr(typ, "__repr__", None) r = getattr(typ, "__repr__", None)
if issubclass(typ, dict) and r is dict.__repr__: if issubclass(typ, dict):
write('{') write('{')
if self._indent_per_level > 1: if self._indent_per_level > 1:
write((self._indent_per_level - 1) * ' ') write((self._indent_per_level - 1) * ' ')
@ -171,6 +171,9 @@ class PrettyPrinter:
if length: if length:
context[objid] = 1 context[objid] = 1
indent = indent + self._indent_per_level indent = indent + self._indent_per_level
if issubclass(typ, _OrderedDict):
items = list(object.items())
else:
items = sorted(object.items(), key=_safe_tuple) items = sorted(object.items(), key=_safe_tuple)
key, ent = items[0] key, ent = items[0]
rep = self._repr(key, context, level) rep = self._repr(key, context, level)

View File

@ -3,6 +3,8 @@ import test.support
import unittest import unittest
import test.test_set import test.test_set
import random import random
import collections
import itertools
# list, tuple and dict subclasses that do or don't overwrite __repr__ # list, tuple and dict subclasses that do or don't overwrite __repr__
class list2(list): class list2(list):
@ -195,6 +197,20 @@ class QueryTestCase(unittest.TestCase):
self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}), self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}),
r"{5: [[]], 'xy\tab\n': (3,), (): {}}") 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): def test_subclassing(self):
o = {'names with spaces': 'should be presented using repr()', o = {'names with spaces': 'should be presented using repr()',
'others.should.not.be': 'like.this'} 'others.should.not.be': 'like.this'}

View File

@ -16,6 +16,9 @@ Core and Builtins
Library 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 - Logging: Added QueueHandler class to facilitate logging usage with
multiprocessing. multiprocessing.