]> granicus.if.org Git - python/commitdiff
Issue #19104: pprint now produces evaluable output for wrapped strings.
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 20 Dec 2014 18:57:15 +0000 (20:57 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 20 Dec 2014 18:57:15 +0000 (20:57 +0200)
Lib/pprint.py
Lib/test/test_pprint.py
Misc/NEWS

index 3be9c3625401ea8ca7c534c371245c9293c28f97..2cbffed5d8db508a24b5d94b52f6759c80cc7d65 100644 (file)
@@ -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)
 
index 3d364c4595747380e50bf801d981d9438f27587c..ad6a7a144a06653dba6e22847dfbc672537d5fa9 100644 (file)
@@ -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)] +
index 37b081cc2a087871641f1aed4526845b255059a9..dd4dc63e495b4c946b5eaa58db8cab0910322627 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.