summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-12-20 18:57:15 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2014-12-20 18:57:15 (GMT)
commitfe3dc376fa73fce563be26417ea763b05115990b (patch)
tree286e2d24f64a15e2aecda42f8b43070a02a045af
parentf65d1d3b0241f79715df04192e21144672704fd7 (diff)
downloadcpython-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.py58
-rw-r--r--Lib/test/test_pprint.py23
-rw-r--r--Misc/NEWS2
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)] +
diff --git a/Misc/NEWS b/Misc/NEWS
index 37b081c..dd4dc63 100644
--- 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.