diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-12-20 18:57:15 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-12-20 18:57:15 (GMT) |
commit | fe3dc376fa73fce563be26417ea763b05115990b (patch) | |
tree | 286e2d24f64a15e2aecda42f8b43070a02a045af | |
parent | f65d1d3b0241f79715df04192e21144672704fd7 (diff) | |
download | cpython-fe3dc376fa73fce563be26417ea763b05115990b.zip cpython-fe3dc376fa73fce563be26417ea763b05115990b.tar.gz cpython-fe3dc376fa73fce563be26417ea763b05115990b.tar.bz2 |
Issue #19104: pprint now produces evaluable output for wrapped strings.
-rw-r--r-- | Lib/pprint.py | 58 | ||||
-rw-r--r-- | Lib/test/test_pprint.py | 23 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 47 insertions, 36 deletions
diff --git a/Lib/pprint.py b/Lib/pprint.py index 3be9c36..2cbffed 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -235,35 +235,41 @@ class PrettyPrinter: return if issubclass(typ, str) and len(object) > 0 and r is str.__repr__: - def _str_parts(s): - """ - Return a list of string literals comprising the repr() - of the given string using literal concatenation. - """ - lines = s.splitlines(True) - for i, line in enumerate(lines): - rep = repr(line) - if len(rep) <= max_width: - yield rep - else: - # A list of alternating (non-space, space) strings - parts = re.split(r'(\s+)', line) + [''] - current = '' - for i in range(0, len(parts), 2): - part = parts[i] + parts[i+1] - candidate = current + part - if len(repr(candidate)) > max_width: - if current: - yield repr(current) - current = part - else: - current = candidate - if current: - yield repr(current) - for i, rep in enumerate(_str_parts(object)): + chunks = [] + lines = object.splitlines(True) + if level == 1: + indent += 1 + max_width -= 2 + for i, line in enumerate(lines): + rep = repr(line) + if len(rep) <= max_width: + chunks.append(rep) + else: + # A list of alternating (non-space, space) strings + parts = re.split(r'(\s+)', line) + [''] + current = '' + for i in range(0, len(parts), 2): + part = parts[i] + parts[i+1] + candidate = current + part + if len(repr(candidate)) > max_width: + if current: + chunks.append(repr(current)) + current = part + else: + current = candidate + if current: + chunks.append(repr(current)) + if len(chunks) == 1: + write(rep) + return + if level == 1: + write('(') + for i, rep in enumerate(chunks): if i > 0: write('\n' + ' '*indent) write(rep) + if level == 1: + write(')') return write(rep) diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index 3d364c4..ad6a7a1 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -536,9 +536,10 @@ frozenset2({0, # pprint tries to wrap strings intelligently fox = 'the quick brown fox jumped over a lazy dog' self.assertEqual(pprint.pformat(fox, width=20), """\ -'the quick brown ' -'fox jumped over ' -'a lazy dog'""") +('the quick ' + 'brown fox ' + 'jumped over a ' + 'lazy dog')""") self.assertEqual(pprint.pformat({'a': 1, 'b': fox, 'c': 2}, width=26), """\ {'a': 1, @@ -552,12 +553,12 @@ frozenset2({0, # - non-ASCII is allowed # - an apostrophe doesn't disrupt the pprint special = "Portons dix bons \"whiskys\"\nà l'avocat goujat\t qui fumait au zoo" - self.assertEqual(pprint.pformat(special, width=20), """\ -'Portons dix bons ' -'"whiskys"\\n' -"à l'avocat " -'goujat\\t qui ' -'fumait au zoo'""") + self.assertEqual(pprint.pformat(special, width=21), """\ +('Portons dix ' + 'bons "whiskys"\\n' + "à l'avocat " + 'goujat\\t qui ' + 'fumait au zoo')""") # An unwrappable string is formatted as its repr unwrappable = "x" * 100 self.assertEqual(pprint.pformat(unwrappable, width=80), repr(unwrappable)) @@ -566,7 +567,9 @@ frozenset2({0, special *= 10 for width in range(3, 40): formatted = pprint.pformat(special, width=width) - self.assertEqual(eval("(" + formatted + ")"), special) + self.assertEqual(eval(formatted), special) + formatted = pprint.pformat([special] * 2, width=width) + self.assertEqual(eval(formatted), [special] * 2) def test_compact(self): o = ([list(range(i * i)) for i in range(5)] + @@ -41,6 +41,8 @@ Core and Builtins Library ------- +- Issue #19104: pprint now produces evaluable output for wrapped strings. + - Issue #23071: Added missing names to codecs.__all__. Patch by Martin Panter. - Issue #15513: Added a __sizeof__ implementation for pickle classes. |