summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-03-24 19:31:50 +0200
committerSerhiy Storchaka <storchaka@gmail.com>2015-03-24 19:31:50 +0200
commit87eb482e30ec76976e7c04b1547faaab0df40261 (patch)
tree14fe5585683be0734d33da68ea2f40f52686edca
parent022f20376a2458e0ecbd38e393957452570cd3a4 (diff)
downloadcpython-git-87eb482e30ec76976e7c04b1547faaab0df40261.tar.gz
Issue #23502: The pprint module now supports mapping proxies.
In particular the __dict__ attributes of building types.
-rw-r--r--Lib/pprint.py9
-rw-r--r--Lib/test/test_pprint.py29
-rw-r--r--Misc/NEWS2
3 files changed, 40 insertions, 0 deletions
diff --git a/Lib/pprint.py b/Lib/pprint.py
index 5b65f579d9..9031a0b6ef 100644
--- a/Lib/pprint.py
+++ b/Lib/pprint.py
@@ -36,6 +36,7 @@ saferepr()
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 @@ class PrettyPrinter:
_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 --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py
index 50d7d59ecc..3a798d946c 100644
--- a/Lib/test/test_pprint.py
+++ b/Lib/test/test_pprint.py
@@ -7,6 +7,7 @@ import test.test_set
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 @@ class QueryTestCase(unittest.TestCase):
'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 --git a/Misc/NEWS b/Misc/NEWS
index 139a681467..abd072d7a8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -26,6 +26,8 @@ Core and Builtins
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.