What is the most reliable way for adding pretty-printing support to custom python3 classes?
For interactive data evaluation I found pretty-printing support quite important. However, both iPython's pretty-printer IPython.lib.pretty.pprint and the standard-library pprint.pprint support only builtin structure types by default (lists, tuples, dictionaries), and use the plain repr() for everything else. Notably, this even includes otherwise extremly useful utilities like collections.namedtuple().
As a result, the pretty-printed output is often weirdly formatted.
My current, awkard workaround is to define classes like
class MyPrettyClass(dict):
def __init__(self, ...):
self.__dict__ = self
self._class = self.__class__ # In order to recognize the type.
...
<A LOT OF FIELDS>
...
In a real-world example this resulted in
{'__lp_mockup_xml': <lxml.etree._ElementTree object at 0x0000021C5EB53DC8>,
'__lp_mockup_xml_file': 'E:\\DataDirectory\\mockup.xml',
'__lp_realrun_xml_file': 'E:\\DataDirectory\\realrun.xml',
'_class': <class '__main__.readall'>,
'_docopy': False,
'dirname': 'E:\\DataDirectory'}
Is there any better method to get pretty-printing support?
Weakly related: My question Lowlevel introspection in python3? was originally aimed at building my own class-agnostic pretty-printer, but yielded no results.