Kaydet (Commit) fdda2001 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #19137: The pprint module now correctly formats empty set and frozenset

and instances of set and frozenset subclasses.
üst 3760d97f
...@@ -185,25 +185,18 @@ class PrettyPrinter: ...@@ -185,25 +185,18 @@ class PrettyPrinter:
if issubclass(typ, list): if issubclass(typ, list):
write('[') write('[')
endchar = ']' endchar = ']'
elif issubclass(typ, set): elif issubclass(typ, tuple):
if not length: write('(')
write('set()') endchar = ')'
return else:
write('set([')
endchar = '])'
object = _sorted(object)
indent += 4
elif issubclass(typ, frozenset):
if not length: if not length:
write('frozenset()') write(rep)
return return
write('frozenset([') write(typ.__name__)
write('([')
endchar = '])' endchar = '])'
indent += len(typ.__name__) + 1
object = _sorted(object) object = _sorted(object)
indent += 10
else:
write('(')
endchar = ')'
if self._indent_per_level > 1 and sepLines: if self._indent_per_level > 1 and sepLines:
write((self._indent_per_level - 1) * ' ') write((self._indent_per_level - 1) * ' ')
if length: if length:
......
...@@ -24,6 +24,20 @@ class tuple3(tuple): ...@@ -24,6 +24,20 @@ class tuple3(tuple):
def __repr__(self): def __repr__(self):
return tuple.__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): class dict2(dict):
pass pass
...@@ -114,22 +128,24 @@ class QueryTestCase(unittest.TestCase): ...@@ -114,22 +128,24 @@ class QueryTestCase(unittest.TestCase):
for simple in (0, 0L, 0+0j, 0.0, "", uni(""), for simple in (0, 0L, 0+0j, 0.0, "", uni(""),
(), tuple2(), tuple3(), (), tuple2(), tuple3(),
[], list2(), list3(), [], list2(), list3(),
set(), set2(), set3(),
frozenset(), frozenset2(), frozenset3(),
{}, dict2(), dict3(), {}, dict2(), dict3(),
self.assertTrue, pprint, self.assertTrue, pprint,
-6, -6L, -6-6j, -1.5, "x", uni("x"), (3,), [3], {3: 6}, -6, -6L, -6-6j, -1.5, "x", uni("x"), (3,), [3], {3: 6},
(1,2), [3,4], {5: 6}, (1,2), [3,4], {5: 6},
tuple2((1,2)), tuple3((1,2)), tuple3(range(100)), tuple2((1,2)), tuple3((1,2)), tuple3(range(100)),
[3,4], list2([3,4]), list3([3,4]), list3(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}), dict2({5: 6}), dict3({5: 6}),
range(10, -11, -1) range(10, -11, -1)
): ):
native = repr(simple) native = repr(simple)
for function in "pformat", "saferepr": self.assertEqual(pprint.pformat(simple), native)
f = getattr(pprint, function) self.assertEqual(pprint.pformat(simple, width=1, indent=0)
got = f(simple) .replace('\n', ' '), native)
self.assertEqual(native, got, self.assertEqual(pprint.saferepr(simple), native)
"expected %s got %s from pprint.%s" %
(native, got, function))
def test_basic_line_wrap(self): def test_basic_line_wrap(self):
# verify basic line-wrapping operation # verify basic line-wrapping operation
...@@ -205,19 +221,59 @@ class QueryTestCase(unittest.TestCase): ...@@ -205,19 +221,59 @@ class QueryTestCase(unittest.TestCase):
self.assertEqual(DottedPrettyPrinter().pformat(o), exp) self.assertEqual(DottedPrettyPrinter().pformat(o), exp)
def test_set_reprs(self): 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(set(range(3))), 'set([0, 1, 2])')
self.assertEqual(pprint.pformat(frozenset()), 'frozenset()') self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\
self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset([0, 1, 2])') 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 = """\ cube_repr_tgt = """\
{frozenset([]): frozenset([frozenset([2]), frozenset([0]), frozenset([1])]), {frozenset([]): frozenset([frozenset([2]), frozenset([0]), frozenset([1])]),
frozenset([0]): frozenset([frozenset(), frozenset([0]): frozenset([frozenset([]),
frozenset([0, 2]), frozenset([0, 2]),
frozenset([0, 1])]), frozenset([0, 1])]),
frozenset([1]): frozenset([frozenset(), frozenset([1]): frozenset([frozenset([]),
frozenset([1, 2]), frozenset([1, 2]),
frozenset([0, 1])]), frozenset([0, 1])]),
frozenset([2]): frozenset([frozenset(), frozenset([2]): frozenset([frozenset([]),
frozenset([1, 2]), frozenset([1, 2]),
frozenset([0, 2])]), frozenset([0, 2])]),
frozenset([1, 2]): frozenset([frozenset([2]), frozenset([1, 2]): frozenset([frozenset([2]),
...@@ -243,7 +299,7 @@ class QueryTestCase(unittest.TestCase): ...@@ -243,7 +299,7 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([0]), frozenset([frozenset([0]),
frozenset([0, frozenset([0,
1])]), 1])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([0])]), frozenset([0])]),
frozenset([frozenset([2]), frozenset([frozenset([2]),
frozenset([0, frozenset([0,
...@@ -259,7 +315,7 @@ class QueryTestCase(unittest.TestCase): ...@@ -259,7 +315,7 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([1]), frozenset([frozenset([1]),
frozenset([1, frozenset([1,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([1])])]), frozenset([1])])]),
frozenset([frozenset([1, 2]), frozenset([1])]): frozenset([frozenset([frozenset([1, frozenset([frozenset([1, 2]), frozenset([1])]): frozenset([frozenset([frozenset([1,
2]), 2]),
...@@ -269,7 +325,7 @@ class QueryTestCase(unittest.TestCase): ...@@ -269,7 +325,7 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([2]), frozenset([frozenset([2]),
frozenset([1, frozenset([1,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([1])]), frozenset([1])]),
frozenset([frozenset([1]), frozenset([frozenset([1]),
frozenset([0, frozenset([0,
...@@ -285,7 +341,7 @@ class QueryTestCase(unittest.TestCase): ...@@ -285,7 +341,7 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([2]), frozenset([frozenset([2]),
frozenset([0, frozenset([0,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([2])])]), frozenset([2])])]),
frozenset([frozenset([]), frozenset([0])]): frozenset([frozenset([frozenset([0]), frozenset([frozenset([]), frozenset([0])]): frozenset([frozenset([frozenset([0]),
frozenset([0, frozenset([0,
...@@ -293,16 +349,16 @@ class QueryTestCase(unittest.TestCase): ...@@ -293,16 +349,16 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([0]), frozenset([frozenset([0]),
frozenset([0, frozenset([0,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([1])]), frozenset([1])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([2])])]), frozenset([2])])]),
frozenset([frozenset([]), frozenset([1])]): frozenset([frozenset([frozenset(), frozenset([frozenset([]), frozenset([1])]): frozenset([frozenset([frozenset([]),
frozenset([0])]), frozenset([0])]),
frozenset([frozenset([1]), frozenset([frozenset([1]),
frozenset([1, frozenset([1,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([2])]), frozenset([2])]),
frozenset([frozenset([1]), frozenset([frozenset([1]),
frozenset([0, frozenset([0,
...@@ -310,9 +366,9 @@ class QueryTestCase(unittest.TestCase): ...@@ -310,9 +366,9 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([2]), frozenset([])]): frozenset([frozenset([frozenset([2]), frozenset([frozenset([2]), frozenset([])]): frozenset([frozenset([frozenset([2]),
frozenset([1, frozenset([1,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([0])]), frozenset([0])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([1])]), frozenset([1])]),
frozenset([frozenset([2]), frozenset([frozenset([2]),
frozenset([0, frozenset([0,
...@@ -333,7 +389,7 @@ class QueryTestCase(unittest.TestCase): ...@@ -333,7 +389,7 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([1]), frozenset([frozenset([1]),
frozenset([0, frozenset([0,
1])])]), 1])])]),
frozenset([frozenset([0]), frozenset([0, 1])]): frozenset([frozenset([frozenset(), frozenset([frozenset([0]), frozenset([0, 1])]): frozenset([frozenset([frozenset([]),
frozenset([0])]), frozenset([0])]),
frozenset([frozenset([0, frozenset([frozenset([0,
1]), 1]),
...@@ -357,7 +413,7 @@ class QueryTestCase(unittest.TestCase): ...@@ -357,7 +413,7 @@ class QueryTestCase(unittest.TestCase):
frozenset([frozenset([0]), frozenset([frozenset([0]),
frozenset([0, frozenset([0,
2])]), 2])]),
frozenset([frozenset(), frozenset([frozenset([]),
frozenset([2])])]), frozenset([2])])]),
frozenset([frozenset([0, 1, 2]), frozenset([0, 2])]): frozenset([frozenset([frozenset([1, frozenset([frozenset([0, 1, 2]), frozenset([0, 2])]): frozenset([frozenset([frozenset([1,
2]), 2]),
......
...@@ -32,6 +32,9 @@ Core and Builtins ...@@ -32,6 +32,9 @@ Core and Builtins
Library 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 - Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to
prevent readline() calls from consuming too much memory. Patch by Jyrki prevent readline() calls from consuming too much memory. Patch by Jyrki
Pulliainen. Pulliainen.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment