实现自定义漂亮打印机的最佳方式

int*_*ted 21 python xml docbook subclass pretty-print

定制 pprint.PrettyPrinter

pprint模块的文档提到该方法PrettyPrinter.format旨在使自定义格式化成为可能.

我认为可以在子类中重写此方法,但这似乎没有提供让基类方法应用换行和缩进的方法.

  • 我在这里错过了什么吗?
  • 有没有更好的方法来做到这一点(例如另一个模块)?

备择方案?

我已经检查了pretty模块,看起来很有趣,但似乎没有提供一种方法来自定义其他模块的类格式而无需修改这些模块.

我认为我正在寻找的东西可以让我提供类型(或可能是函数)的映射,这些类型可以识别处理节点的例程的类型.处理节点的例程将获取一个节点并返回它的字符串表示以及子节点列表.等等.

为什么我要看漂亮的印刷品

我的目标是紧凑地打印DocBook格式的自定义格式部分xml.etree.ElementTree.

(我很惊讶没有找到更多Python支持DocBook.也许我错过了那些东西.)

我在一个名为xmlearn的客户端中构建了一些使用lxml的基本功能.例如,要转储Docbook文件,您可以:

xmlearn -i docbook_file.xml dump -f docbook -r book
Run Code Online (Sandbox Code Playgroud)

这是相当半屁股,但它让我得到了我正在寻找的信息.

xmlearn还具有其他功能,例如构建图形图像的能力以及显示XML文档中标记之间关系的转储.这些与这个问题完全无关.

您还可以执行转储到任意深度,或将XPath指定为一组起始点.XPath的东西有点过时了特定于docbook的格式,所以它并没有真正发展完善.

这仍然不是这个问题的答案.我仍然希望那里有一个可以随意定制的漂亮打印机.

小智 5

我的解决方案是用一个简单的包装器替换 pprint.PrettyPrinter ,该包装器在调用原始打印机之前格式化它找到的任何浮点数。

from __future__ import division
import pprint
if not hasattr(pprint,'old_printer'):
    pprint.old_printer=pprint.PrettyPrinter

class MyPrettyPrinter(pprint.old_printer):
    def _format(self,obj,*args,**kwargs):
        if isinstance(obj,float):
            obj=round(obj,4)
        return pprint.old_printer._format(self,obj,*args,**kwargs)
pprint.PrettyPrinter=MyPrettyPrinter

def pp(obj):
    pprint.pprint(obj)

if __name__=='__main__':
    x=[1,2,4,6,457,3,8,3,4]
    x=[_/17 for _ in x]
    pp(x)
Run Code Online (Sandbox Code Playgroud)


小智 3

这个问题可能与以下问题重复:

\n\n\n\n
\n\n

使用pprint.PrettyPrinter

\n\n

我查看了pprint 的来源。这似乎表明,为了增强pprint(),您\xe2\x80\x99d 需要:

\n\n
    \n
  • 子类PrettyPrinter
  • \n
  • 覆盖_format()
  • \n
  • 测试issubclass(),
  • \n
  • 并且(如果这不是你的班级),传回_format()
  • \n
\n\n

选择

\n\n

我认为更好的方法就是拥有自己的pprint(),这取决于pprint.pformat它不知道发生了什么的情况。

\n\n

例如:

\n\n
\'\'\'Extending pprint\'\'\'\n\nfrom pprint import pformat\n\nclass CrazyClass: pass\n\ndef prettyformat(obj):\n    if isinstance(obj, CrazyClass):\n        return "^CrazyFoSho^"\n    else:\n        return pformat(obj)\n\ndef prettyp(obj):\n    print(prettyformat(obj))\n\n# test\nprettyp([1]*100)\nprettyp(CrazyClass())\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里最大的好处是您不依赖于pprint内部结构。它\xe2\x80\x99 明确而简洁。

\n\n

缺点是您\xe2\x80\x99必须手动处理缩进。

\n

  • **Alternative** 的另一个缺点是 `prettyp([CrazyClass()])` 不起作用。 (3认同)