为什么Python 3';s PrettyPrinter的行为不同于python2';s、 我怎样才能得到同样的行为?
当我尝试运行此代码时:为什么Python 3';s PrettyPrinter的行为不同于python2';s、 我怎样才能得到同样的行为?,python,python-3.x,pprint,Python,Python 3.x,Pprint,当我尝试运行此代码时: from pprint import PrettyPrinter class MyPrettyPrinter(PrettyPrinter): def __init__(self, *args, **kwargs): PrettyPrinter.__init__(self, *args, **kwargs) def format(self, object, context, maxlevels, level): (repr,
from pprint import PrettyPrinter
class MyPrettyPrinter(PrettyPrinter):
def __init__(self, *args, **kwargs):
PrettyPrinter.__init__(self, *args, **kwargs)
def format(self, object, context, maxlevels, level):
(repr, readable, recursive) = PrettyPrinter.format(self, object, context, maxlevels, level)
return (type(repr)(object), readable, recursive) if isinstance(object, str) else (repr, readable, recursive)
print(MyPrettyPrinter().pformat(['x']))
我在Python 3中的输出(['x']
)与在Python 2中的输出([x]
)不同
这是为什么?我如何获得与Python 2中相同的行为?这就是Python 3的内部
\u格式
函数的工作原理:
def _format(self, object, stream, indent, allowance, context, level):
# …
rep = self._repr(object, context, level - 1)
max_width = self._width - 1 - indent - allowance
sepLines = len(rep) > max_width
if sepLines:
# … custom repr logic
write(rep)
如您所见,如果\u repr
的输出适合一行,则不使用生成repr的自定义逻辑self.\u repr
将委托给self.format
,这实际上只是执行更复杂的repr()
。因此,如果输出适合一行,则只调用一次;否则,将不使用输出,而是将(此处为:sequence)元素拆分为多个部分,并再次为子元素调用逻辑
相比之下,Python2的\u格式
在任何阶段都实现了完全定制的逻辑,总是为列表中的所有子元素调用定制的格式化程序。这就是为什么触发器在Python2中有效,但在Python3中无效
不幸的是,如果不复制新的Python3实现中的大量逻辑,我看不到任何简单的方法来实现这一点。+1哈,很有趣。你能称之为臭虫吗?对我来说这似乎是一个bug,但我不确定这是否是故意的……我不会称之为bug,因为这是一种实现细节。但是,文档建议对漂亮的打印机进行子类化,但没有确保为每个级别调用
格式,这对我来说确实很奇怪。