Issue #23502: The pprint module now supports mapping proxies.

In particular the __dict__ attributes of building types.
This commit is contained in:
Serhiy Storchaka 2015-03-24 19:31:50 +02:00
parent 022f20376a
commit 87eb482e30
3 changed files with 40 additions and 0 deletions

View File

@ -36,6 +36,7 @@ saferepr()
import re import re
import sys as _sys import sys as _sys
import types as _types
from collections import OrderedDict as _OrderedDict from collections import OrderedDict as _OrderedDict
from io import StringIO as _StringIO from io import StringIO as _StringIO
@ -313,6 +314,14 @@ class PrettyPrinter:
_dispatch[bytearray.__repr__] = _pprint_bytearray _dispatch[bytearray.__repr__] = _pprint_bytearray
def _pprint_mappingproxy(self, object, stream, indent, allowance, context, level):
stream.write('mappingproxy(')
self._format(object.copy(), stream, indent + 13, allowance + 1,
context, level)
stream.write(')')
_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy
def _format_dict_items(self, items, stream, indent, allowance, context, def _format_dict_items(self, items, stream, indent, allowance, context,
level): level):
write = stream.write write = stream.write

View File

@ -7,6 +7,7 @@ import test.test_set
import random import random
import collections import collections
import itertools import itertools
import types
# list, tuple and dict subclasses that do or don't overwrite __repr__ # list, tuple and dict subclasses that do or don't overwrite __repr__
class list2(list): class list2(list):
@ -271,6 +272,34 @@ class QueryTestCase(unittest.TestCase):
'a': 6, 'a': 6,
'lazy': 7, 'lazy': 7,
'dog': 8}""") 'dog': 8}""")
def test_mapping_proxy(self):
words = 'the quick brown fox jumped over a lazy dog'.split()
d = dict(zip(words, itertools.count()))
m = types.MappingProxyType(d)
self.assertEqual(pprint.pformat(m), """\
mappingproxy({'a': 6,
'brown': 2,
'dog': 8,
'fox': 3,
'jumped': 4,
'lazy': 7,
'over': 5,
'quick': 1,
'the': 0})""")
d = collections.OrderedDict(zip(words, itertools.count()))
m = types.MappingProxyType(d)
self.assertEqual(pprint.pformat(m), """\
mappingproxy({'the': 0,
'quick': 1,
'brown': 2,
'fox': 3,
'jumped': 4,
'over': 5,
'a': 6,
'lazy': 7,
'dog': 8})""")
def test_subclassing(self): def test_subclassing(self):
o = {'names with spaces': 'should be presented using repr()', o = {'names with spaces': 'should be presented using repr()',
'others.should.not.be': 'like.this'} 'others.should.not.be': 'like.this'}

View File

@ -26,6 +26,8 @@ Core and Builtins
Library Library
------- -------
- Issue #23502: The pprint module now supports mapping proxies.
- Issue #17530: pprint now wraps long bytes objects and bytearrays. - Issue #17530: pprint now wraps long bytes objects and bytearrays.
- Issue #22687: Fixed some corner cases in breaking words in tetxtwrap. - Issue #22687: Fixed some corner cases in breaking words in tetxtwrap.