为什么python3的PrettyPrinter与python2的行为不同,我如何获得相同的行为?

2024-09-29 23:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

当我尝试运行此代码时:

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']))

python3(['x'])中的Iget输出与python2([x])中的Iget输出不同。你知道吗

为什么会这样?我如何获得与Python2相同的行为?你知道吗


Tags: selfformatobjectinitdefcontextprettyprinterargs
1条回答
网友
1楼 · 发布于 2024-09-29 23:32:38

python3的内部_format函数就是这样工作的:

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)

如您所见,如果_repr的输出适合于一行,则不使用用于生成repr的自定义逻辑。self._repr委托给self.format,这实际上只是做了一个更复杂的repr()。因此,如果输出放在一行中,则只调用一次;否则,不使用输出,而是将(这里是:sequence)元素拆分为多个部分,并再次为子元素调用逻辑。你知道吗

相比之下,python2的_format在任何阶段都实现了完全定制的逻辑,总是为列表中的所有子元素调用定制的格式化程序。这就是为什么触发器在Python2中工作,而在Python3中不工作。你知道吗

不幸的是,如果不复制新的python3实现中的大量逻辑,我看不到任何简单的方法来实现这个功能。你知道吗

相关问题 更多 >

    热门问题