@@ -64,15 +64,15 @@ def pp(object, *args, sort_dicts=False, **kwargs):
64
64
65
65
def saferepr (object ):
66
66
"""Version of repr() which can handle recursive data structures."""
67
- return _safe_repr (object , {}, None , 0 , True )[0 ]
67
+ return PrettyPrinter (). _safe_repr (object , {}, None , 0 )[0 ]
68
68
69
69
def isreadable (object ):
70
70
"""Determine if saferepr(object) is readable by eval()."""
71
- return _safe_repr (object , {}, None , 0 , True )[1 ]
71
+ return PrettyPrinter (). _safe_repr (object , {}, None , 0 )[1 ]
72
72
73
73
def isrecursive (object ):
74
74
"""Determine if object requires a recursive representation."""
75
- return _safe_repr (object , {}, None , 0 , True )[2 ]
75
+ return PrettyPrinter (). _safe_repr (object , {}, None , 0 )[2 ]
76
76
77
77
class _safe_key :
78
78
"""Helper function for key functions when sorting unorderable objects.
@@ -435,7 +435,7 @@ def format(self, object, context, maxlevels, level):
435
435
and flags indicating whether the representation is 'readable'
436
436
and whether the object represents a recursive construct.
437
437
"""
438
- return _safe_repr (object , context , maxlevels , level , self . _sort_dicts )
438
+ return self . _safe_repr (object , context , maxlevels , level )
439
439
440
440
def _pprint_default_dict (self , object , stream , indent , allowance , context , level ):
441
441
if not len (object ):
@@ -518,77 +518,79 @@ def _pprint_user_string(self, object, stream, indent, allowance, context, level)
518
518
519
519
_dispatch [_collections .UserString .__repr__ ] = _pprint_user_string
520
520
521
- # Return triple (repr_string, isreadable, isrecursive).
521
+ def _safe_repr (self , object , context , maxlevels , level ):
522
+ # Return triple (repr_string, isreadable, isrecursive).
523
+ typ = type (object )
524
+ if typ in _builtin_scalars :
525
+ return repr (object ), True , False
522
526
523
- def _safe_repr (object , context , maxlevels , level , sort_dicts ):
524
- typ = type (object )
525
- if typ in _builtin_scalars :
526
- return repr (object ), True , False
527
-
528
- r = getattr (typ , "__repr__" , None )
529
- if issubclass (typ , dict ) and r is dict .__repr__ :
530
- if not object :
531
- return "{}" , True , False
532
- objid = id (object )
533
- if maxlevels and level >= maxlevels :
534
- return "{...}" , False , objid in context
535
- if objid in context :
536
- return _recursion (object ), False , True
537
- context [objid ] = 1
538
- readable = True
539
- recursive = False
540
- components = []
541
- append = components .append
542
- level += 1
543
- if sort_dicts :
544
- items = sorted (object .items (), key = _safe_tuple )
545
- else :
546
- items = object .items ()
547
- for k , v in items :
548
- krepr , kreadable , krecur = _safe_repr (k , context , maxlevels , level , sort_dicts )
549
- vrepr , vreadable , vrecur = _safe_repr (v , context , maxlevels , level , sort_dicts )
550
- append ("%s: %s" % (krepr , vrepr ))
551
- readable = readable and kreadable and vreadable
552
- if krecur or vrecur :
553
- recursive = True
554
- del context [objid ]
555
- return "{%s}" % ", " .join (components ), readable , recursive
556
-
557
- if (issubclass (typ , list ) and r is list .__repr__ ) or \
558
- (issubclass (typ , tuple ) and r is tuple .__repr__ ):
559
- if issubclass (typ , list ):
527
+ r = getattr (typ , "__repr__" , None )
528
+ if issubclass (typ , dict ) and r is dict .__repr__ :
560
529
if not object :
561
- return "[]" , True , False
562
- format = "[%s]"
563
- elif len (object ) == 1 :
564
- format = "(%s,)"
565
- else :
566
- if not object :
567
- return "()" , True , False
568
- format = "(%s)"
569
- objid = id (object )
570
- if maxlevels and level >= maxlevels :
571
- return format % "..." , False , objid in context
572
- if objid in context :
573
- return _recursion (object ), False , True
574
- context [objid ] = 1
575
- readable = True
576
- recursive = False
577
- components = []
578
- append = components .append
579
- level += 1
580
- for o in object :
581
- orepr , oreadable , orecur = _safe_repr (o , context , maxlevels , level , sort_dicts )
582
- append (orepr )
583
- if not oreadable :
584
- readable = False
585
- if orecur :
586
- recursive = True
587
- del context [objid ]
588
- return format % ", " .join (components ), readable , recursive
589
-
590
- rep = repr (object )
591
- return rep , (rep and not rep .startswith ('<' )), False
530
+ return "{}" , True , False
531
+ objid = id (object )
532
+ if maxlevels and level >= maxlevels :
533
+ return "{...}" , False , objid in context
534
+ if objid in context :
535
+ return _recursion (object ), False , True
536
+ context [objid ] = 1
537
+ readable = True
538
+ recursive = False
539
+ components = []
540
+ append = components .append
541
+ level += 1
542
+ if self ._sort_dicts :
543
+ items = sorted (object .items (), key = _safe_tuple )
544
+ else :
545
+ items = object .items ()
546
+ for k , v in items :
547
+ krepr , kreadable , krecur = self .format (
548
+ k , context , maxlevels , level )
549
+ vrepr , vreadable , vrecur = self .format (
550
+ v , context , maxlevels , level )
551
+ append ("%s: %s" % (krepr , vrepr ))
552
+ readable = readable and kreadable and vreadable
553
+ if krecur or vrecur :
554
+ recursive = True
555
+ del context [objid ]
556
+ return "{%s}" % ", " .join (components ), readable , recursive
557
+
558
+ if (issubclass (typ , list ) and r is list .__repr__ ) or \
559
+ (issubclass (typ , tuple ) and r is tuple .__repr__ ):
560
+ if issubclass (typ , list ):
561
+ if not object :
562
+ return "[]" , True , False
563
+ format = "[%s]"
564
+ elif len (object ) == 1 :
565
+ format = "(%s,)"
566
+ else :
567
+ if not object :
568
+ return "()" , True , False
569
+ format = "(%s)"
570
+ objid = id (object )
571
+ if maxlevels and level >= maxlevels :
572
+ return format % "..." , False , objid in context
573
+ if objid in context :
574
+ return _recursion (object ), False , True
575
+ context [objid ] = 1
576
+ readable = True
577
+ recursive = False
578
+ components = []
579
+ append = components .append
580
+ level += 1
581
+ for o in object :
582
+ orepr , oreadable , orecur = self .format (
583
+ o , context , maxlevels , level )
584
+ append (orepr )
585
+ if not oreadable :
586
+ readable = False
587
+ if orecur :
588
+ recursive = True
589
+ del context [objid ]
590
+ return format % ", " .join (components ), readable , recursive
591
+
592
+ rep = repr (object )
593
+ return rep , (rep and not rep .startswith ('<' )), False
592
594
593
595
_builtin_scalars = frozenset ({str , bytes , bytearray , int , float , complex ,
594
596
bool , type (None )})
@@ -604,7 +606,7 @@ def _perfcheck(object=None):
604
606
object = [("string" , (1 , 2 ), [3 , 4 ], {5 : 6 , 7 : 8 })] * 100000
605
607
p = PrettyPrinter ()
606
608
t1 = time .perf_counter ()
607
- _safe_repr (object , {}, None , 0 , True )
609
+ p . _safe_repr (object , {}, None , 0 , True )
608
610
t2 = time .perf_counter ()
609
611
p .pformat (object )
610
612
t3 = time .perf_counter ()
0 commit comments