From: Serhiy Storchaka Date: Wed, 2 Oct 2013 08:40:26 +0000 (+0300) Subject: Issue #19137: The pprint module now correctly formats empty set and frozenset X-Git-Tag: v2.7.6rc1~117 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fdda200195f9747e411d3491aae0806bc1fcd919;p=python Issue #19137: The pprint module now correctly formats empty set and frozenset and instances of set and frozenset subclasses. --- diff --git a/Lib/pprint.py b/Lib/pprint.py index 330099dfea..77f2a566f3 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -185,25 +185,18 @@ class PrettyPrinter: if issubclass(typ, list): write('[') endchar = ']' - elif issubclass(typ, set): - if not length: - write('set()') - return - write('set([') - endchar = '])' - object = _sorted(object) - indent += 4 - elif issubclass(typ, frozenset): + elif issubclass(typ, tuple): + write('(') + endchar = ')' + else: if not length: - write('frozenset()') + write(rep) return - write('frozenset([') + write(typ.__name__) + write('([') endchar = '])' + indent += len(typ.__name__) + 1 object = _sorted(object) - indent += 10 - else: - write('(') - endchar = ')' if self._indent_per_level > 1 and sepLines: write((self._indent_per_level - 1) * ' ') if length: diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index e0137dfc59..50493f6d1a 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -24,6 +24,20 @@ class tuple3(tuple): def __repr__(self): return tuple.__repr__(self) +class set2(set): + pass + +class set3(set): + def __repr__(self): + return set.__repr__(self) + +class frozenset2(frozenset): + pass + +class frozenset3(frozenset): + def __repr__(self): + return frozenset.__repr__(self) + class dict2(dict): pass @@ -114,22 +128,24 @@ class QueryTestCase(unittest.TestCase): for simple in (0, 0L, 0+0j, 0.0, "", uni(""), (), tuple2(), tuple3(), [], list2(), list3(), + set(), set2(), set3(), + frozenset(), frozenset2(), frozenset3(), {}, dict2(), dict3(), self.assertTrue, pprint, -6, -6L, -6-6j, -1.5, "x", uni("x"), (3,), [3], {3: 6}, (1,2), [3,4], {5: 6}, tuple2((1,2)), tuple3((1,2)), tuple3(range(100)), [3,4], list2([3,4]), list3([3,4]), list3(range(100)), + set({7}), set2({7}), set3({7}), + frozenset({8}), frozenset2({8}), frozenset3({8}), dict2({5: 6}), dict3({5: 6}), range(10, -11, -1) ): native = repr(simple) - for function in "pformat", "saferepr": - f = getattr(pprint, function) - got = f(simple) - self.assertEqual(native, got, - "expected %s got %s from pprint.%s" % - (native, got, function)) + self.assertEqual(pprint.pformat(simple), native) + self.assertEqual(pprint.pformat(simple, width=1, indent=0) + .replace('\n', ' '), native) + self.assertEqual(pprint.saferepr(simple), native) def test_basic_line_wrap(self): # verify basic line-wrapping operation @@ -205,19 +221,59 @@ class QueryTestCase(unittest.TestCase): self.assertEqual(DottedPrettyPrinter().pformat(o), exp) def test_set_reprs(self): - self.assertEqual(pprint.pformat(set()), 'set()') + self.assertEqual(pprint.pformat(set()), 'set([])') self.assertEqual(pprint.pformat(set(range(3))), 'set([0, 1, 2])') - self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') - self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset([0, 1, 2])') + self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\ +set([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(set2(range(7)), width=20), '''\ +set2([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(set3(range(7)), width=20), + 'set3([0, 1, 2, 3, 4, 5, 6])') + + self.assertEqual(pprint.pformat(frozenset()), 'frozenset([])') + self.assertEqual(pprint.pformat(frozenset(range(3))), + 'frozenset([0, 1, 2])') + self.assertEqual(pprint.pformat(frozenset(range(7)), width=20), '''\ +frozenset([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(frozenset2(range(7)), width=20), '''\ +frozenset2([0, + 1, + 2, + 3, + 4, + 5, + 6])''') + self.assertEqual(pprint.pformat(frozenset3(range(7)), width=20), + 'frozenset3([0, 1, 2, 3, 4, 5, 6])') + + def test_set_of_sets_reprs(self): cube_repr_tgt = """\ {frozenset([]): frozenset([frozenset([2]), frozenset([0]), frozenset([1])]), - frozenset([0]): frozenset([frozenset(), + frozenset([0]): frozenset([frozenset([]), frozenset([0, 2]), frozenset([0, 1])]), - frozenset([1]): frozenset([frozenset(), + frozenset([1]): frozenset([frozenset([]), frozenset([1, 2]), frozenset([0, 1])]), - frozenset([2]): frozenset([frozenset(), + frozenset([2]): frozenset([frozenset([]), frozenset([1, 2]), frozenset([0, 2])]), frozenset([1, 2]): frozenset([frozenset([2]), @@ -243,7 +299,7 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([0]), frozenset([0, 1])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([0])]), frozenset([frozenset([2]), frozenset([0, @@ -259,7 +315,7 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([1]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])])]), frozenset([frozenset([1, 2]), frozenset([1])]): frozenset([frozenset([frozenset([1, 2]), @@ -269,7 +325,7 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([2]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]), frozenset([frozenset([1]), frozenset([0, @@ -285,7 +341,7 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([2]), frozenset([0, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])])]), frozenset([frozenset([]), frozenset([0])]): frozenset([frozenset([frozenset([0]), frozenset([0, @@ -293,16 +349,16 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([0]), frozenset([0, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])])]), - frozenset([frozenset([]), frozenset([1])]): frozenset([frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]): frozenset([frozenset([frozenset([]), frozenset([0])]), frozenset([frozenset([1]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])]), frozenset([frozenset([1]), frozenset([0, @@ -310,9 +366,9 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([2]), frozenset([])]): frozenset([frozenset([frozenset([2]), frozenset([1, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([0])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([1])]), frozenset([frozenset([2]), frozenset([0, @@ -333,7 +389,7 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([1]), frozenset([0, 1])])]), - frozenset([frozenset([0]), frozenset([0, 1])]): frozenset([frozenset([frozenset(), + frozenset([frozenset([0]), frozenset([0, 1])]): frozenset([frozenset([frozenset([]), frozenset([0])]), frozenset([frozenset([0, 1]), @@ -357,7 +413,7 @@ class QueryTestCase(unittest.TestCase): frozenset([frozenset([0]), frozenset([0, 2])]), - frozenset([frozenset(), + frozenset([frozenset([]), frozenset([2])])]), frozenset([frozenset([0, 1, 2]), frozenset([0, 2])]): frozenset([frozenset([frozenset([1, 2]), diff --git a/Misc/NEWS b/Misc/NEWS index 191a87e100..feb3f080b0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- Issue #19137: The pprint module now correctly formats empty set and frozenset + and instances of set and frozenset subclasses. + - Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to prevent readline() calls from consuming too much memory. Patch by Jyrki Pulliainen.