Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现定制漂亮打印机的最佳方法 自定义pprint.PrettyPrinter_Python_Xml_Subclass_Pretty Print_Docbook - Fatal编程技术网

Python 实现定制漂亮打印机的最佳方法 自定义pprint.PrettyPrinter

Python 实现定制漂亮打印机的最佳方法 自定义pprint.PrettyPrinter,python,xml,subclass,pretty-print,docbook,Python,Xml,Subclass,Pretty Print,Docbook,pprint模块的文档中提到了方法PrettyPrinter.format旨在使自定义格式成为可能 我推测在子类中重写这个方法是可能的,但这似乎并没有提供一种让基类方法应用换行和缩进的方法 我是不是遗漏了什么 是否有更好的方法(例如,另一个模块) 选择? 我已经检查了这个模块,它看起来很有趣,但似乎没有提供一种方法来定制来自其他模块的类的格式,而不修改这些模块 我想我正在寻找的是一种能够让我提供类型(或者可能是函数)映射的东西,这些类型可以识别处理节点的例程的类型。处理节点的例程将获取一个节

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

我推测在子类中重写这个方法是可能的,但这似乎并没有提供一种让基类方法应用换行和缩进的方法

  • 我是不是遗漏了什么
  • 是否有更好的方法(例如,另一个模块)
选择? 我已经检查了这个模块,它看起来很有趣,但似乎没有提供一种方法来定制来自其他模块的类的格式,而不修改这些模块

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

为什么我要研究漂亮的印刷品 我的最终目标是紧凑地打印DocBook格式化的
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
模块:


我的解决方案是用一个简单的包装器替换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)

如果要修改默认的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'))))")))))