bpo-37376: pprint support for SimpleNamespace (GH-14318)
https://bugs.python.org/issue37376
This commit is contained in:
parent
d52a83a3d4
commit
06a8916cf4
@ -25,6 +25,9 @@ width constraint.
|
|||||||
|
|
||||||
Dictionaries are sorted by key before the display is computed.
|
Dictionaries are sorted by key before the display is computed.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.9
|
||||||
|
Added support for pretty-printing :class:`types.SimpleNamespace`.
|
||||||
|
|
||||||
The :mod:`pprint` module defines one class:
|
The :mod:`pprint` module defines one class:
|
||||||
|
|
||||||
.. First the implementation class:
|
.. First the implementation class:
|
||||||
|
@ -111,6 +111,12 @@ threads were never supported in subinterpreters. Previously, the subinterpreter
|
|||||||
finalization crashed with a Pyton fatal error if a daemon thread was still
|
finalization crashed with a Pyton fatal error if a daemon thread was still
|
||||||
running.
|
running.
|
||||||
|
|
||||||
|
pprint
|
||||||
|
------
|
||||||
|
|
||||||
|
:mod:`pprint` can now pretty-print :class:`types.SimpleNamespace`.
|
||||||
|
(Contributed by Carl Bordum Hansen in :issue:`37376`.)
|
||||||
|
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
=============
|
=============
|
||||||
|
@ -342,6 +342,33 @@ class PrettyPrinter:
|
|||||||
|
|
||||||
_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy
|
_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy
|
||||||
|
|
||||||
|
def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level):
|
||||||
|
if type(object) is _types.SimpleNamespace:
|
||||||
|
# The SimpleNamespace repr is "namespace" instead of the class
|
||||||
|
# name, so we do the same here. For subclasses; use the class name.
|
||||||
|
cls_name = 'namespace'
|
||||||
|
else:
|
||||||
|
cls_name = object.__class__.__name__
|
||||||
|
indent += len(cls_name) + 1
|
||||||
|
delimnl = ',\n' + ' ' * indent
|
||||||
|
items = object.__dict__.items()
|
||||||
|
last_index = len(items) - 1
|
||||||
|
|
||||||
|
stream.write(cls_name + '(')
|
||||||
|
for i, (key, ent) in enumerate(items):
|
||||||
|
stream.write(key)
|
||||||
|
stream.write('=')
|
||||||
|
|
||||||
|
last = i == last_index
|
||||||
|
self._format(ent, stream, indent + len(key) + 1,
|
||||||
|
allowance if last else 1,
|
||||||
|
context, level)
|
||||||
|
if not last:
|
||||||
|
stream.write(delimnl)
|
||||||
|
stream.write(')')
|
||||||
|
|
||||||
|
_dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace
|
||||||
|
|
||||||
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
|
||||||
|
@ -346,6 +346,65 @@ mappingproxy(OrderedDict([('the', 0),
|
|||||||
('lazy', 7),
|
('lazy', 7),
|
||||||
('dog', 8)]))""")
|
('dog', 8)]))""")
|
||||||
|
|
||||||
|
def test_empty_simple_namespace(self):
|
||||||
|
ns = types.SimpleNamespace()
|
||||||
|
formatted = pprint.pformat(ns)
|
||||||
|
self.assertEqual(formatted, "namespace()")
|
||||||
|
|
||||||
|
def test_small_simple_namespace(self):
|
||||||
|
ns = types.SimpleNamespace(a=1, b=2)
|
||||||
|
formatted = pprint.pformat(ns)
|
||||||
|
self.assertEqual(formatted, "namespace(a=1, b=2)")
|
||||||
|
|
||||||
|
def test_simple_namespace(self):
|
||||||
|
ns = types.SimpleNamespace(
|
||||||
|
the=0,
|
||||||
|
quick=1,
|
||||||
|
brown=2,
|
||||||
|
fox=3,
|
||||||
|
jumped=4,
|
||||||
|
over=5,
|
||||||
|
a=6,
|
||||||
|
lazy=7,
|
||||||
|
dog=8,
|
||||||
|
)
|
||||||
|
formatted = pprint.pformat(ns, width=60)
|
||||||
|
self.assertEqual(formatted, """\
|
||||||
|
namespace(the=0,
|
||||||
|
quick=1,
|
||||||
|
brown=2,
|
||||||
|
fox=3,
|
||||||
|
jumped=4,
|
||||||
|
over=5,
|
||||||
|
a=6,
|
||||||
|
lazy=7,
|
||||||
|
dog=8)""")
|
||||||
|
|
||||||
|
def test_simple_namespace_subclass(self):
|
||||||
|
class AdvancedNamespace(types.SimpleNamespace): pass
|
||||||
|
ns = AdvancedNamespace(
|
||||||
|
the=0,
|
||||||
|
quick=1,
|
||||||
|
brown=2,
|
||||||
|
fox=3,
|
||||||
|
jumped=4,
|
||||||
|
over=5,
|
||||||
|
a=6,
|
||||||
|
lazy=7,
|
||||||
|
dog=8,
|
||||||
|
)
|
||||||
|
formatted = pprint.pformat(ns, width=60)
|
||||||
|
self.assertEqual(formatted, """\
|
||||||
|
AdvancedNamespace(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'}
|
||||||
|
@ -628,6 +628,7 @@ Mark Hammond
|
|||||||
Harald Hanche-Olsen
|
Harald Hanche-Olsen
|
||||||
Manus Hand
|
Manus Hand
|
||||||
Milton L. Hankins
|
Milton L. Hankins
|
||||||
|
Carl Bordum Hansen
|
||||||
Stephen Hansen
|
Stephen Hansen
|
||||||
Barry Hantman
|
Barry Hantman
|
||||||
Lynda Hardman
|
Lynda Hardman
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
:mod:`pprint` now has support for :class:`types.SimpleNamespace`. Patch by Carl
|
||||||
|
Bordum Hansen.
|
Loading…
x
Reference in New Issue
Block a user