Have pprint() respect the order in an OrderedDict.
This commit is contained in:
parent
a0e79408bc
commit
bad3c88094
|
@ -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,7 +171,10 @@ class PrettyPrinter:
|
||||||
if length:
|
if length:
|
||||||
context[objid] = 1
|
context[objid] = 1
|
||||||
indent = indent + self._indent_per_level
|
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]
|
key, ent = items[0]
|
||||||
rep = self._repr(key, context, level)
|
rep = self._repr(key, context, level)
|
||||||
write(rep)
|
write(rep)
|
||||||
|
|
|
@ -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'}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue