diff --git a/Lib/reprlib.py b/Lib/reprlib.py index ab18247682b69a..6a065a8927b751 100644 --- a/Lib/reprlib.py +++ b/Lib/reprlib.py @@ -51,7 +51,7 @@ class Repr: def __init__( self, *, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, - maxother=30, fillvalue='...', indent=None, + maxother=30, fillvalue='...', indent=None, sort_dicts=True, ): self.maxlevel = maxlevel self.maxtuple = maxtuple @@ -66,6 +66,7 @@ def __init__( self.maxother = maxother self.fillvalue = fillvalue self.indent = indent + self.sort_dicts = sort_dicts def repr(self, x): return self.repr1(x, self.maxlevel) @@ -162,7 +163,8 @@ def repr_dict(self, x, level): newlevel = level - 1 repr1 = self.repr1 pieces = [] - for key in islice(_possibly_sorted(x), self.maxdict): + keys = _possibly_sorted(x) if self.sort_dicts else list(x) + for key in islice(keys, self.maxdict): keyrepr = repr1(key, newlevel) valrepr = repr1(x[key], newlevel) pieces.append('%s: %s' % (keyrepr, valrepr)) diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py index 5a95a05c6496a2..16c32698102505 100644 --- a/Lib/test/test_reprlib.py +++ b/Lib/test/test_reprlib.py @@ -273,6 +273,24 @@ def test_unsortable(self): r(y) r(z) + def test_sort_dicts_true(self): + r = Repr(sort_dicts=True) + d = {"zaz": 3, "xoo": 1, "yar": 2} + e = dict(sorted(d.items())) + self.assertEqual(r.repr(d), __builtins__.repr(e)) + + def test_sort_dicts_false(self): + r = Repr(sort_dicts=False) + d = {"zaz": 3, "xoo": 1, "yar": 2} + e = dict(d) + self.assertEqual(r.repr(d), __builtins__.repr(e)) + + def test_sort_dicts_default(self): + r = Repr() + d = {"zaz": 3, "xoo": 1, "yar": 2} + e = dict(sorted(d.items())) + self.assertEqual(r.repr(d), __builtins__.repr(e)) + def test_valid_indent(self): test_cases = [ {