Python 3.x: 另一种pprint实现

10

标准的pprint模块在处理列表、字典等对象时很好用。但是在处理自定义类时,有时就完全不能用了:

  • 想要让它输出某个类的对象的可用信息,唯一的方法是覆盖__repr__,但是如果我的类已经有了漂亮的、可通过eval()运行的__repr__,而且这个__repr__并没有显示我想在pprint输出中看到的信息怎么办?

  • 好吧,我会编写面向打印的__repr__,但是在这种情况下,无法对类内部的某些内容进行漂亮的打印:

.

class Data:
    def __init__(self):
        self.d = {...}

我无法对self.d内容进行美化打印,只能返回单行表示(至少不涉及堆栈跟踪等)。

覆盖PrettyPrinter不是一个选择,因为我不想每次想要美化打印同一个类时都要这样做。

那么...有没有任何其他的方法可以使自定义类可美化打印,而不需要使用pprint?


找到了 https://pypi.python.org/pypi/pretty/0.1 ,但它似乎只支持py2.X。 - Equidamoid
我只能返回单行表示,为什么呢?例如NumPy返回的多行repr()可以正常工作。这里有一个例子,作为Python字符串:"array([(0, 0, (0, 0, 0)), (0, 0, (0, 0, 0)), (0, 0, (0, 0, 0)),\n (0, 0, (0, 0, 0))], \n dtype=[('foo', 'u1'), ('bar', '<u2'), ('baz', [('fbb', 'u1'), ('oaa', 'u1'), ('orz', 'u1')])])"。它可以正常地eval(),并且'array'在命名空间中。 - kampu
是的,我试图编辑并指出我刚刚意识到了这一点,但是5分钟的编辑宽限期已经结束了。不管怎样,很高兴知道我们在同一个页面上 :) - kampu
为什么在编写自定义__repr__时,无法在类内部对某些内容进行漂亮的打印?它返回的字符串可以包含对象的任何字段的表示。 - utapyngo
@utapyngo完成了。哎呀,有关子类化的短语有点不正确 %) 我只是不想将对特定类的支持添加到“PrettyPrinter”中(因为类特定代码不应该在那里),并且正在寻找“通用”解决方案,例如我在第一条评论中提到的那个。 - Equidamoid
显示剩余4条评论
4个回答

4

3
如果漂亮模块符合您的需求,您可以将其与Python 3配合使用。
  1. Download and unpack the pretty.py file.
  2. Run 2to3 on it:

    python -m lib2to3 -w pretty.py
    
  3. Comment out the following lines:

    569: types.DictProxyType:        _dict_pprinter_factory('<dictproxy {', '}>'),
    580: xrange:                     _repr_pprint,
    
  4. Put the file near your script.

  5. Import it as usual:

    import pretty
    

@Equidamoid:你成功了吗? - utapyngo
然而,pretty 不喜欢 numpy.ndarray =( - Equidamoid

1

如果你想要美观地打印输出,你可能需要使用__str__,而不是(或者同时也要使用)__repr__

例如:

>>> import datetime
>>> now = datetime.datetime.now()
>>> print now
2013-05-19 13:00:34.085383
>>> print repr(now)
datetime.datetime(2013, 5, 19, 13, 0, 34, 85383)

现在想象一下,你有一个类,里面有几个dict,它们足够大,无法适应一个终端行。然后你有一个dict,里面有几个这样的对象... 这就是我的情况。 - Equidamoid

0
您可以通过子类化PrettyPrinter来创建一个通用的解决方案,以打印对象字段的内容。obj.__dict__将为您提供obj的所有字段的字典。
或者,您可以只使用obj.__class__.__name__ + pformat(obj.__dict__)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接