Skip to content

Commit

Permalink
Issue #19137: The pprint module now correctly formats empty set and f…
Browse files Browse the repository at this point in the history
…rozenset

and instances of set and frozenset subclasses.
  • Loading branch information
serhiy-storchaka committed Oct 2, 2013
1 parent 3760d97 commit fdda200
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 39 deletions.
23 changes: 8 additions & 15 deletions Lib/pprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,25 +185,18 @@ def _format(self, object, stream, indent, allowance, context, level):
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:
Expand Down
104 changes: 80 additions & 24 deletions Lib/test/test_pprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -114,22 +128,24 @@ def test_same_as_repr(self):
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
Expand Down Expand Up @@ -205,19 +221,59 @@ def test_subclassing(self):
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]),
Expand All @@ -243,7 +299,7 @@ def test_set_reprs(self):
frozenset([frozenset([0]),
frozenset([0,
1])]),
frozenset([frozenset(),
frozenset([frozenset([]),
frozenset([0])]),
frozenset([frozenset([2]),
frozenset([0,
Expand All @@ -259,7 +315,7 @@ def test_set_reprs(self):
frozenset([frozenset([1]),
frozenset([1,
2])]),
frozenset([frozenset(),
frozenset([frozenset([]),
frozenset([1])])]),
frozenset([frozenset([1, 2]), frozenset([1])]): frozenset([frozenset([frozenset([1,
2]),
Expand All @@ -269,7 +325,7 @@ def test_set_reprs(self):
frozenset([frozenset([2]),
frozenset([1,
2])]),
frozenset([frozenset(),
frozenset([frozenset([]),
frozenset([1])]),
frozenset([frozenset([1]),
frozenset([0,
Expand All @@ -285,34 +341,34 @@ def test_set_reprs(self):
frozenset([frozenset([2]),
frozenset([0,
2])]),
frozenset([frozenset(),
frozenset([frozenset([]),
frozenset([2])])]),
frozenset([frozenset([]), frozenset([0])]): frozenset([frozenset([frozenset([0]),
frozenset([0,
1])]),
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,
1])])]),
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,
Expand All @@ -333,7 +389,7 @@ def test_set_reprs(self):
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]),
Expand All @@ -357,7 +413,7 @@ def test_set_reprs(self):
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]),
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit fdda200

Please sign in to comment.