为什么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,因为这是一种实现细节。但是,文档建议对漂亮的打印机进行子类化,但没有确保为每个级别调用
格式,这对我来说确实很奇怪。