Skip to content

Commit d88618a

Browse files
committed
bpo-27495: Make pprint.pformat always order sets
1 parent 3cde378 commit d88618a

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

Lib/pprint.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,37 @@ def _safe_repr(object, context, maxlevels, level, sort_dicts):
587587
del context[objid]
588588
return format % ", ".join(components), readable, recursive
589589

590+
if (issubclass(typ, set) and r is set.__repr__) or \
591+
(issubclass(typ, frozenset) and r is frozenset.__repr__):
592+
if not object:
593+
return repr(object), True, False
594+
if typ is set:
595+
format = "{%s}"
596+
else:
597+
format = typ.__name__ + "({%s})"
598+
objid = id(object)
599+
if maxlevels and level >= maxlevels:
600+
return "{...}", False, objid in context
601+
if objid in context:
602+
return _recursion(object), False, True
603+
context[objid] = 1
604+
readable = True
605+
recursive = False
606+
components = []
607+
append = components.append
608+
level += 1
609+
saferepr = _safe_repr
610+
items = sorted(object, key=_safe_key)
611+
for item in items:
612+
orepr, oreadable, orecur = saferepr(item, context, maxlevels, level, sort_dicts)
613+
append("%s" % orepr)
614+
if not oreadable:
615+
readable = False
616+
if orecur:
617+
recursive = True
618+
del context[objid]
619+
return format % ", ".join(components), readable, recursive
620+
590621
rep = repr(object)
591622
return rep, (rep and not rep.startswith('<')), False
592623

Lib/test/test_pprint.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,9 @@ def test_subclassing(self):
463463
def test_set_reprs(self):
464464
self.assertEqual(pprint.pformat(set()), 'set()')
465465
self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}')
466+
self.assertEqual(pprint.pformat(set([-1, 0, 1])), "{-1, 0, 1}")
467+
self.assertEqual(pprint.pformat(set("0123")), "{'0', '1', '2', '3'}")
468+
self.assertEqual(pprint.pformat(set("abcd")), "{'a', 'b', 'c', 'd'}")
466469
self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\
467470
{0,
468471
1,
@@ -471,6 +474,9 @@ def test_set_reprs(self):
471474
4,
472475
5,
473476
6}''')
477+
self.assertEqual(pprint.pformat(set2([-1, 0, 1])), "set2({-1, 0, 1})")
478+
self.assertEqual(pprint.pformat(set2("0123")), "set2({'0', '1', '2', '3'})")
479+
self.assertEqual(pprint.pformat(set2("abcd")), "set2({'a', 'b', 'c', 'd'})")
474480
self.assertEqual(pprint.pformat(set2(range(7)), width=20), '''\
475481
set2({0,
476482
1,
@@ -485,6 +491,12 @@ def test_set_reprs(self):
485491
self.assertEqual(pprint.pformat(frozenset()), 'frozenset()')
486492
self.assertEqual(pprint.pformat(frozenset(range(3))),
487493
'frozenset({0, 1, 2})')
494+
self.assertEqual(pprint.pformat(frozenset([-1, 0, 1])),
495+
"frozenset({-1, 0, 1})")
496+
self.assertEqual(pprint.pformat(frozenset("0123")),
497+
"frozenset({'0', '1', '2', '3'})")
498+
self.assertEqual(pprint.pformat(frozenset("abcd")),
499+
"frozenset({'a', 'b', 'c', 'd'})")
488500
self.assertEqual(pprint.pformat(frozenset(range(7)), width=20), '''\
489501
frozenset({0,
490502
1,
@@ -493,6 +505,12 @@ def test_set_reprs(self):
493505
4,
494506
5,
495507
6})''')
508+
self.assertEqual(pprint.pformat(frozenset2([-1, 0, 1])),
509+
"frozenset2({-1, 0, 1})")
510+
self.assertEqual(pprint.pformat(frozenset2("0123")),
511+
"frozenset2({'0', '1', '2', '3'})")
512+
self.assertEqual(pprint.pformat(frozenset2("abcd")),
513+
"frozenset2({'a', 'b', 'c', 'd'})")
496514
self.assertEqual(pprint.pformat(frozenset2(range(7)), width=20), '''\
497515
frozenset2({0,
498516
1,

0 commit comments

Comments
 (0)