From 23da6e654586bd59af566c6ed5d3e89bc55e8b23 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Mon, 12 May 2008 16:26:52 +0000 Subject: #1713041: fix pprint's handling of maximum depth. --- Doc/library/pprint.rst | 5 ++--- Lib/pprint.py | 10 +++++++--- Lib/test/test_pprint.py | 15 +++++++++++++++ Misc/NEWS | 2 ++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index b3778f1..c0bedf5 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -66,8 +66,7 @@ The :mod:`pprint` module defines one class: ... ('parrot', ('fresh fruit',)))))))) >>> pp = pprint.PrettyPrinter(depth=6) >>> pp.pprint(tup) - ('spam', - ('eggs', ('lumberjack', ('knights', ('ni', ('dead', ('parrot', (...,)))))))) + ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...))))))) The :class:`PrettyPrinter` class supports several derivative functions: @@ -220,7 +219,7 @@ This example demonstrates several uses of the :func:`pprint` function and its pa ['cccccccccccccccccccc', 'dddddddddddddddddddd']] >>> pprint.pprint(stuff, depth=3) ['aaaaaaaaaa', - ('spam', ('eggs', ('lumberjack', (...)))), + ('spam', ('eggs', (...))), ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'], ['cccccccccccccccccccc', 'dddddddddddddddddddd']] >>> pprint.pprint(stuff, width=60) diff --git a/Lib/pprint.py b/Lib/pprint.py index 9f9d6a2..93d850a 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -131,6 +131,10 @@ class PrettyPrinter: sepLines = _len(rep) > (self._width - 1 - indent - allowance) write = stream.write + if self._depth and level > self._depth: + write(rep) + return + r = getattr(typ, "__repr__", None) if issubclass(typ, dict) and r is dict.__repr__: write('{') @@ -211,8 +215,8 @@ class PrettyPrinter: write(',') write(endchar) return - write(rep) + write(rep) def _repr(self, object, context, level): repr, readable, recursive = self.format(object, context.copy(), @@ -259,7 +263,7 @@ def _safe_repr(object, context, maxlevels, level): if not object: return "{}", True, False objid = _id(object) - if maxlevels and level > maxlevels: + if maxlevels and level >= maxlevels: return "{...}", False, objid in context if objid in context: return _recursion(object), False, True @@ -293,7 +297,7 @@ def _safe_repr(object, context, maxlevels, level): return "()", True, False format = "(%s)" objid = _id(object) - if maxlevels and level > maxlevels: + if maxlevels and level >= maxlevels: return format % "...", False, objid in context if objid in context: return _recursion(object), False, True diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index 83c772b..4d7a3ed 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -387,6 +387,21 @@ class QueryTestCase(unittest.TestCase): cubo = test.test_set.linegraph(cube) self.assertEqual(pprint.pformat(cubo), cubo_repr_tgt) + def test_depth(self): + nested_tuple = (1, (2, (3, (4, (5, 6))))) + nested_dict = {1: {2: {3: {4: {5: {6: 6}}}}}} + nested_list = [1, [2, [3, [4, [5, [6, []]]]]]] + self.assertEqual(pprint.pformat(nested_tuple), repr(nested_tuple)) + self.assertEqual(pprint.pformat(nested_dict), repr(nested_dict)) + self.assertEqual(pprint.pformat(nested_list), repr(nested_list)) + + lv1_tuple = '(1, (...))' + lv1_dict = '{1: {...}}' + lv1_list = '[1, [...]]' + self.assertEqual(pprint.pformat(nested_tuple, depth=1), lv1_tuple) + self.assertEqual(pprint.pformat(nested_dict, depth=1), lv1_dict) + self.assertEqual(pprint.pformat(nested_list, depth=1), lv1_list) + class DottedPrettyPrinter(pprint.PrettyPrinter): diff --git a/Misc/NEWS b/Misc/NEWS index 0647833..4431d90 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -26,6 +26,8 @@ Extension Modules Library ------- +- #1713041: fix pprint's handling of maximum depth. + - The timing module has been deprecated for removal in Python 3.0. - The sv module has been deprecated for removal in Python 3.0. -- cgit v0.12