Python有一台漂亮的打印机(pprint(...)).我想让我的课程非常可打印.如果我提供特定的接口,pretty print会以更好的方式打印我的实例吗?

8.11节中的Python文档展示了不同的示例,但没有示例说明如何使用户定义的类非常可打印.

So what interface need my classes to provide?


Use Case:

我想漂亮地打印ConfigParser的内容,为此我创建了一个名为ExtendenConfigParser的扩展版本.因此,我有可能添加更多功能或添加匹配的漂亮打印界面.

推荐答案

pprint不寻找任何挂钩.pprint.PrettyPrinter改用dispatch pattern;类上的一系列方法,这些方法被键入class.__repr__个引用.

你可以将pprint.PrettyPrinter子类用于教授你的课程:

class YourPrettyPrinter(pprint.PrettyPrinter):
    _dispatch = pprint.PrettyPrinter._dispatch.copy()

    def _pprint_yourtype(self, object, stream, indent, allowance, context, level):
        stream.write('YourType(')
        self._format(object.foo, stream, indent, allowance + 1,
                     context, level)
        self._format(object.bar, stream, indent, allowance + 1,
                     context, level)
        stream.write(')')

    _dispatch[YourType.__repr__] = _pprint_yourtype

然后直接使用该类漂亮地打印包含YourType个实例的数据.请注意,这取决于拥有自己的自定义__repr__方法的类型!

你也可以直接将函数插入PrettyPrinter._dispatch字典;self是显式传入的.对于第三方库来说,这可能是更好的 Select :

from pprint import PrettyPrinter

if isinstance(getattr(PrettyPrinter, '_dispatch'), dict):
     # assume the dispatch table method still works
     def pprint_ExtendedConfigParser(printer, object, stream, indent, allowance, context, level):
         # pretty print it!
     PrettyPrinter._dispactch[ExtendedConfigParser.__repr__] = pprint_ExtendedConfigParser

其他分派方法是如何编写的,请参见pprint module source code.

和往常一样,像_dispatch这样的单下划线名称是内部实现细节,可以在future 的版本中更改.然而,这是你在这里的最佳 Select .调度表增加了in Python 3.5个,至少在Python 3.5-3.9 alpha中存在.

Python-3.x相关问答推荐

根据其他数据框架的列顺序从数据框架中进行 Select

Numpy将3D数组的每个切片相乘以进行转置并对其求和

在多个测试中维护和报告变量

小部件padx和包方法ipadx有什么不同?

从 LeetCode 的 Python 解决方案类中理解关键字 self

为什么不能用格式字符串 '-' 绘制点?

python 分代垃圾收集:get_count 没有报告正确的对象创建数?

使用 Python 截断并重新编号对应于特定 ID/组的列

将数据框中的值与另一个数据框中的多列进行比较,以获取条目以有效方式匹配的列表列表

为什么 mypy 不适用于 sqlalchemy?

python中两个连续的yield语句如何工作?

从 Python2 到 Python3 的这种解包行为的变化是什么?

django - 值更改后自动更新日期

Selenium (Python) - 使用 Chrome 网络驱动程序等待下载过程完成

TypeError:列表索引必须是整数或切片,而不是列表

计算两个文件的行差异的最有效方法是什么?

对字节进行按位运算

如何强制 Sphinx 使用 Python 3.x 解释器

在 linux mint 上安装 python3-venv 模块

在 Python 中生成马尔可夫转移矩阵