diff -r c02f464dd721 Lib/pprint.py --- a/Lib/pprint.py Thu Sep 26 09:35:39 2013 -0700 +++ b/Lib/pprint.py Fri Sep 27 19:47:09 2013 +0300 @@ -241,35 +241,41 @@ 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 -r c02f464dd721 Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py Thu Sep 26 09:35:39 2013 -0700 +++ b/Lib/test/test_pprint.py Fri Sep 27 19:47:09 2013 +0300 @@ -481,9 +481,10 @@ # 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, @@ -497,12 +498,12 @@ # - 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)) @@ -511,7 +512,9 @@ 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) class DottedPrettyPrinter(pprint.PrettyPrinter):