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]."""
5050 printer = PrettyPrinter (
5151 stream = stream , indent = indent , width = width , depth = depth ,
52- compact = compact )
52+ compact = compact , sort_dicts = sort_dicts )
5353 printer .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."""
5758 return 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 :
99104 def __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 """
121129 indent = int (indent )
122130 width = int (width )
@@ -134,6 +142,7 @@ def __init__(self, indent=1, width=80, depth=None, stream=None, *,
134142 else :
135143 self ._stream = _sys .stdout
136144 self ._compact = bool (compact )
145+ self ._sort_dicts = sort_dicts
137146
138147 def pprint (self , object ):
139148 self ._format (object , self ._stream , 0 , 0 , {}, 0 )
@@ -184,7 +193,10 @@ def _pprint_dict(self, object, stream, indent, allowance, context, level):
184193 write ((self ._indent_per_level - 1 ) * ' ' )
185194 length = len (object )
186195 if 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 ()
188200 self ._format_dict_items (items , stream , indent , allowance + 1 ,
189201 context , level )
190202 write ('}' )
@@ -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
407419 def _pprint_default_dict (self , object , stream , indent , allowance , context , level ):
408420 if 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 ):
491503 typ = type (object )
492504 if typ in _builtin_scalars :
493505 return repr (object ), True , False
@@ -507,11 +519,13 @@ def _safe_repr(object, context, maxlevels, level):
507519 components = []
508520 append = components .append
509521 level += 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 ()
512526 for 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 )
515529 append ("%s: %s" % (krepr , vrepr ))
516530 readable = readable and kreadable and vreadable
517531 if krecur or vrecur :
@@ -543,7 +557,7 @@ def _safe_repr(object, context, maxlevels, level):
543557 append = components .append
544558 level += 1
545559 for 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 )
547561 append (orepr )
548562 if not oreadable :
549563 readable = False
@@ -569,7 +583,7 @@ def _perfcheck(object=None):
569583 object = [("string" , (1 , 2 ), [3 , 4 ], {5 : 6 , 7 : 8 })] * 100000
570584 p = PrettyPrinter ()
571585 t1 = time .perf_counter ()
572- _safe_repr (object , {}, None , 0 )
586+ _safe_repr (object , {}, None , 0 , True )
573587 t2 = time .perf_counter ()
574588 p .pformat (object )
575589 t3 = time .perf_counter ()
0 commit comments