changeset: 95169:646a7e1da7f0 user: Serhiy Storchaka date: Tue Mar 24 19:31:50 2015 +0200 files: Lib/pprint.py Lib/test/test_pprint.py Misc/NEWS description: Issue #23502: The pprint module now supports mapping proxies. In particular the __dict__ attributes of building types. diff -r 976de10bf731 -r 646a7e1da7f0 Lib/pprint.py --- a/Lib/pprint.py Tue Mar 24 19:22:37 2015 +0200 +++ b/Lib/pprint.py Tue Mar 24 19:31:50 2015 +0200 @@ -36,6 +36,7 @@ import re import sys as _sys +import types as _types from collections import OrderedDict as _OrderedDict from io import StringIO as _StringIO @@ -313,6 +314,14 @@ _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, level): write = stream.write diff -r 976de10bf731 -r 646a7e1da7f0 Lib/test/test_pprint.py --- a/Lib/test/test_pprint.py Tue Mar 24 19:22:37 2015 +0200 +++ b/Lib/test/test_pprint.py Tue Mar 24 19:31:50 2015 +0200 @@ -7,6 +7,7 @@ import random import collections import itertools +import types # list, tuple and dict subclasses that do or don't overwrite __repr__ class list2(list): @@ -271,6 +272,34 @@ 'a': 6, 'lazy': 7, '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): o = {'names with spaces': 'should be presented using repr()', 'others.should.not.be': 'like.this'} diff -r 976de10bf731 -r 646a7e1da7f0 Misc/NEWS --- a/Misc/NEWS Tue Mar 24 19:22:37 2015 +0200 +++ b/Misc/NEWS Tue Mar 24 19:31:50 2015 +0200 @@ -26,6 +26,8 @@ Library ------- +- Issue #23502: The pprint module now supports mapping proxies. + - Issue #17530: pprint now wraps long bytes objects and bytearrays. - Issue #22687: Fixed some corner cases in breaking words in tetxtwrap.