Python 实现定制漂亮打印机的最佳方法 自定义pprint.PrettyPrinter
Python 实现定制漂亮打印机的最佳方法 自定义pprint.PrettyPrinter,python,xml,subclass,pretty-print,docbook,Python,Xml,Subclass,Pretty Print,Docbook,pprint模块的文档中提到了方法PrettyPrinter.format旨在使自定义格式成为可能 我推测在子类中重写这个方法是可能的,但这似乎并没有提供一种让基类方法应用换行和缩进的方法 我是不是遗漏了什么 是否有更好的方法(例如,另一个模块) 选择? 我已经检查了这个模块,它看起来很有趣,但似乎没有提供一种方法来定制来自其他模块的类的格式,而不修改这些模块 我想我正在寻找的是一种能够让我提供类型(或者可能是函数)映射的东西,这些类型可以识别处理节点的例程的类型。处理节点的例程将获取一个节
pprint
模块的文档中提到了方法PrettyPrinter.format
旨在使自定义格式成为可能
我推测在子类中重写这个方法是可能的,但这似乎并没有提供一种让基类方法应用换行和缩进的方法
- 我是不是遗漏了什么
- 是否有更好的方法(例如,另一个模块)
xml.etree.ElementTree
的自定义格式化部分
(我很惊讶没有找到更多对DocBook的Python支持。也许我错过了一些东西。)
我在一个名为的客户端中构建了一些基本功能,该客户端使用。例如,要转储Docbook文件,可以:
xmlearn -i docbook_file.xml dump -f docbook -r book
这真是半途而废,但它给了我想要的信息
还具有其他功能,例如能够构建图形图像并进行转储,以显示XML文档中标记之间的关系。这些与这个问题几乎完全无关
您还可以执行任意深度的转储,或者指定XPath作为一组起点。XPath的东西有点过时了docbook特定的格式,所以这还不是很成熟
这仍然不是这个问题的答案。我仍然希望在某个地方有一台可定制的漂亮打印机。这个问题可能与以下问题重复:
使用
pprint.PrettyPrinter
我看了一遍报纸。这似乎表明,为了增强pprint()
,您需要:
- 子类
PrettyPrinter
- 覆盖
\u格式()
- 测试
issubclass()
- 并且(如果不是您的类),返回到
\u format()
pprint()
,当它不知道发生了什么时,它会遵从pprint.pformat
例如:
“扩展pprint”
从pprint导入pformat
班级:通过
def prettyformat(obj):
如果存在(obj,CrazyClass):
返回“^CrazyFoSho^”
其他:
返回格式(obj)
def预处理类型(obj):
打印(打印格式(obj))
#试验
prettyp([1]*100)
prettyp(CrazyClass())
这里最大的好处是您不依赖于pprint
内部。它是明确和简洁的
缺点是您必须手动处理缩进。考虑使用
pretty
模块:
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)
如果要修改默认的PrettyPrinter而不进行子类化,可以使用
pprint.PrettyPrinter
类上的internal\u dispatch
表。您可以看到如何为字典和列表等内部类型添加分派的示例
下面是我如何为type添加自定义漂亮打印机的:
现在,如果我在任何对象上使用pprint.pprint
,该对象与matchpy.Operation
具有相同的\uuurepr\uuu
,它将使用此方法漂亮地打印它。这也适用于子类,只要它们不重写\uuu repr\uuu
,这是有道理的!如果您有相同的\uuuu repr\uuuu
,那么您就有相同的漂亮打印行为
下面是一些匹配操作的示例:
ReshapeVector(Vector(Scalar('1')),
Vector(Index(Vector(Scalar('0')),
If(Scalar('True'),
Scalar("ReshapeVector(Vector(Scalar('2'), Scalar('2')), Iota(Scalar('10')))"),
Scalar("ReshapeVector(Vector(Scalar('2'), Scalar('2')), Ravel(Iota(Scalar('10'))))")))))
在IPython中可以找到一个支持Python 3.x的改进和维护版本(作为IPython.lib.pretty):这个答案只是一个链接,您应该扩展这个答案来解释如何使用该模块。另一个缺点是
prettyp([CrazyClass()])
不起作用。请参阅此修补程序,这在很久以前就应用于Python:这允许您对PrettyPrinter进行子类化,并覆盖格式
。文中给出了一个例子。请注意,该示例存在缺陷,因为True
和False
将打印为0x1
和0x0
,这隐藏了它们是bool
的事实。
ReshapeVector(Vector(Scalar('1')),
Vector(Index(Vector(Scalar('0')),
If(Scalar('True'),
Scalar("ReshapeVector(Vector(Scalar('2'), Scalar('2')), Iota(Scalar('10')))"),
Scalar("ReshapeVector(Vector(Scalar('2'), Scalar('2')), Ravel(Iota(Scalar('10'))))")))))