如何在自定义 python 3 类 中支持漂亮打印?

How to support pretty-printing in custom python 3 classes?

向自定义 python3 classes 添加漂亮打印支持的最可靠方法是什么?

对于交互式数据评估,我发现漂亮的打印支持非常重要。然而,iPython 的漂亮打印机 IPython.lib.pretty.pprint 和标准库 pprint.pprint 默认只支持内置结构类型(列表、元组、字典),并使用普通的 repr() 其他一切。值得注意的是,这甚至包括其他非常有用的实用程序,如 collections.namedtuple().

因此,漂亮的打印输出通常格式很奇怪。

我目前笨拙的解决方法是定义 class 类似

class MyPrettyClass(dict):
    def __init__(self, ...):
        self.__dict__ = self
        self._class = self.__class__ # In order to recognize the type.
        ... 
        <A LOT OF FIELDS>
        ...

在现实世界的例子中,这导致

{'__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'}

有没有更好的方法来获得漂亮的打印支持?

弱相关:我的问题 Lowlevel introspection in python3? 最初旨在构建我自己的 class 不可知的漂亮打印机,但没有产生任何结果。

对于ipython,pretty-printer会在默认为__repr__之前寻找_repr_pretty_方法。

有关此功能的更多详细信息,请参阅 ipython doc

使用 pprint,我知道的唯一方法是自定义 __repr__