4141from io import StringIO as _StringIO
4242
4343__all__ = ["pprint" ,"pformat" ,"isreadable" ,"isrecursive" ,"saferepr" ,
44- "PrettyPrinter" ]
44+ "PrettyPrinter" , "pp" ]
4545
4646
4747def pprint (object ,stream = None ,indent = 1 ,width = 80 ,depth = None ,* ,
48- compact = False ):
48+ compact = False , sort_dicts = True ):
4949"""Pretty-print a Python object to a stream [default is sys.stdout]."""
5050printer = PrettyPrinter (
5151stream = stream ,indent = indent ,width = width ,depth = depth ,
52- compact = compact )
52+ compact = compact , sort_dicts = sort_dicts )
5353printer .pprint (object )
5454
55- def pformat (object ,indent = 1 ,width = 80 ,depth = None ,* ,compact = False ):
55+ def pformat (object ,indent = 1 ,width = 80 ,depth = None ,* ,
56+ compact = False ,sort_dicts = True ):
5657"""Format a Python object into a pretty-printed representation."""
5758return PrettyPrinter (indent = indent ,width = width ,depth = depth ,
58- compact = compact ).pformat (object )
59+ compact = compact ,sort_dicts = sort_dicts ).pformat (object )
60+
61+ def pp (object ,* args ,sort_dicts = False ,** kwargs ):
62+ """Pretty-print a Python object"""
63+ pprint (object ,* args ,sort_dicts = sort_dicts ,** kwargs )
5964
6065def saferepr (object ):
6166"""Version of repr() which can handle recursive data structures."""
62- return _safe_repr (object , {},None ,0 )[0 ]
67+ return _safe_repr (object , {},None ,0 , True )[0 ]
6368
6469def isreadable (object ):
6570"""Determine if saferepr(object) is readable by eval()."""
66- return _safe_repr (object , {},None ,0 )[1 ]
71+ return _safe_repr (object , {},None ,0 , True )[1 ]
6772
6873def isrecursive (object ):
6974"""Determine if object requires a recursive representation."""
70- return _safe_repr (object , {},None ,0 )[2 ]
75+ return _safe_repr (object , {},None ,0 , True )[2 ]
7176
7277class _safe_key :
7378"""Helper function for key functions when sorting unorderable objects.
@@ -97,7 +102,7 @@ def _safe_tuple(t):
97102
98103class PrettyPrinter :
99104def __init__ (self ,indent = 1 ,width = 80 ,depth = None ,stream = None ,* ,
100- compact = False ):
105+ compact = False , sort_dicts = True ):
101106"""Handle pretty printing operations onto a stream using a set of
102107 configured parameters.
103108
@@ -117,6 +122,9 @@ def __init__(self, indent=1, width=80, depth=None, stream=None, *,
117122 compact
118123 If true, several items will be combined in one line.
119124
125+ sort_dicts
126+ If true, dict keys are sorted.
127+
120128 """
121129indent = int (indent )
122130width = int (width )
@@ -134,6 +142,7 @@ def __init__(self, indent=1, width=80, depth=None, stream=None, *,
134142else :
135143self ._stream = _sys .stdout
136144self ._compact = bool (compact )
145+ self ._sort_dicts = sort_dicts
137146
138147def pprint (self ,object ):
139148self ._format (object ,self ._stream ,0 ,0 , {},0 )
@@ -184,7 +193,10 @@ def _pprint_dict(self, object, stream, indent, allowance, context, level):
184193write ((self ._indent_per_level - 1 )* ' ' )
185194length = len (object )
186195if length :
187- items = sorted (object .items (),key = _safe_tuple )
196+ if self ._sort_dicts :
197+ items = sorted (object .items (),key = _safe_tuple )
198+ else :
199+ items = object .items ()
188200self ._format_dict_items (items ,stream ,indent ,allowance + 1 ,
189201context ,level )
190202write ('}' )
@@ -402,7 +414,7 @@ def format(self, object, context, maxlevels, level):
402414 and flags indicating whether the representation is 'readable'
403415 and whether the object represents a recursive construct.
404416 """
405- return _safe_repr (object ,context ,maxlevels ,level )
417+ return _safe_repr (object ,context ,maxlevels ,level , self . _sort_dicts )
406418
407419def _pprint_default_dict (self ,object ,stream ,indent ,allowance ,context ,level ):
408420if not len (object ):
@@ -487,7 +499,7 @@ def _pprint_user_string(self, object, stream, indent, allowance, context, level)
487499
488500# Return triple (repr_string, isreadable, isrecursive).
489501
490- def _safe_repr (object ,context ,maxlevels ,level ):
502+ def _safe_repr (object ,context ,maxlevels ,level , sort_dicts ):
491503typ = type (object )
492504if typ in _builtin_scalars :
493505return repr (object ),True ,False
@@ -507,11 +519,13 @@ def _safe_repr(object, context, maxlevels, level):
507519components = []
508520append = components .append
509521level += 1
510- saferepr = _safe_repr
511- items = sorted (object .items (),key = _safe_tuple )
522+ if sort_dicts :
523+ items = sorted (object .items (),key = _safe_tuple )
524+ else :
525+ items = object .items ()
512526for k ,v in items :
513- krepr ,kreadable ,krecur = saferepr (k ,context ,maxlevels ,level )
514- vrepr ,vreadable ,vrecur = saferepr (v ,context ,maxlevels ,level )
527+ krepr ,kreadable ,krecur = _safe_repr (k ,context ,maxlevels ,level , sort_dicts )
528+ vrepr ,vreadable ,vrecur = _safe_repr (v ,context ,maxlevels ,level , sort_dicts )
515529append ("%s: %s" % (krepr ,vrepr ))
516530readable = readable and kreadable and vreadable
517531if krecur or vrecur :
@@ -543,7 +557,7 @@ def _safe_repr(object, context, maxlevels, level):
543557append = components .append
544558level += 1
545559for o in object :
546- orepr ,oreadable ,orecur = _safe_repr (o ,context ,maxlevels ,level )
560+ orepr ,oreadable ,orecur = _safe_repr (o ,context ,maxlevels ,level , sort_dicts )
547561append (orepr )
548562if not oreadable :
549563readable = False
@@ -569,7 +583,7 @@ def _perfcheck(object=None):
569583object = [("string" , (1 ,2 ), [3 ,4 ], {5 :6 ,7 :8 })]* 100000
570584p = PrettyPrinter ()
571585t1 = time .perf_counter ()
572- _safe_repr (object , {},None ,0 )
586+ _safe_repr (object , {},None ,0 , True )
573587t2 = time .perf_counter ()
574588p .pformat (object )
575589t3 = time .perf_counter ()