10

标准pprint模块在处理列表、字典等时很好用。但有时完全无法使用自定义类:

  • 使它打印有关某个类的对象的可用信息的唯一方法是 override __repr__,但是如果我的类已经有 nice, eval()'able __repr__,它没有显示我想在 pprint 输出中看到的信息怎么办?

  • 好的,我会写面向打印的__repr__,但在这种情况下,不可能在我的类中漂亮地打印一些东西:

.

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

我不能漂亮地打印self.d内容,我只能返回一行表示(至少不玩堆栈跟踪等)。- 覆盖PrettyPrinter不是一种选择,我不想每次我想漂亮地打印同一个类时都这样做。

那么......是否有任何替代 pprint 允许使自定义类可打印的替代方法?

4

4 回答 4

4

IPython 中有一个改进和维护的 Python 2.x/3.x 端口的“漂亮”库:https ://ipython.readthedocs.io/en/stable/api/generated/IPython.lib.pretty.html

于 2013-09-08T12:31:27.743 回答
3

如果漂亮的模块满足您的需求,您可以使其与 Python 3 一起使用。

  1. 下载并解压pretty.py文件。
  2. 在其上运行 2to3:

    python -m lib2to3 -w pretty.py
    
  3. 注释掉以下几行:

    569: types.DictProxyType:        _dict_pprinter_factory('<dictproxy {', '}>'),
    580: xrange:                     _repr_pprint,
    
  4. 将文件放在脚本附近。

  5. 像往常一样导入它:

    import pretty
    
于 2013-05-19T15:49:10.180 回答
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)
于 2013-05-19T12:01:30.130 回答
0

您可以通过继承 PrettyPrinter 创建一个打印对象字段内容的通用解决方案。 obj.__dict__会给你一本包含所有领域的字典obj

或者你可以只使用obj.__class__.__name__ + pformat(obj.__dict__).

于 2013-05-19T16:08:54.013 回答