告诉 IPython 使用对象的“__str__”而不是“__repr__”作为输出

Tell IPython to use an object's `__str__` instead of `__repr__` for output

默认情况下,IPython显示对象时,好像使用__repr__

__repr__ 应该会产生一个唯一的字符串,在给定正确的环境的情况下,该字符串可用于重建对象。 这与 __str__ 不同,后者应该产生人类可读的输出。

现在假设我们已经编写了一个特定的 class 并且我们希望 IPython 默认生成人类可读的输出(即不显式调用 print__str__). 我们不想通过让我们的 class 的 __repr____str__ 的工作来捏造它。 那将是违反规则的。

有没有办法告诉 IPython 为特定的 class 默认调用 __str__

这当然是可能的;你只需要实现实例方法_repr_pretty_(self)documentation for IPython.lib.pretty 中对此进行了描述。它的实现看起来像这样:

class MyObject:
    def _repr_pretty_(self, p, cycle):
       p.text(str(self) if not cycle else '...')

p 参数是 IPython.lib.pretty.PrettyPrinter 的一个实例,您应该使用其方法来输出要设置格式的对象的文本表示形式。通常你会使用 p.text(text) ,它只是将给定的 text 逐字添加到格式化的表示中,但是如果你的 class 表示一个集合,你可以做一些事情,比如开始和结束组。

cycle 参数是一个布尔值,指示是否检测到引用循环 - 即,您是否试图在同一个调用堆栈中两次格式化对象(这会导致无限循环) .根据您使用的对象类型,可能需要也可能不需要考虑它,但这不会造成伤害。


作为奖励,如果您想为 class 执行此操作,您 可以访问(或者更准确地说,不想)修改,或者只是为了测试做临时改动,可以使用IPython显示格式器的for_type方法,如this example of customizing int display所示。在您的情况下,您将使用

get_ipython().display_formatter.formatters['text/plain'].for_type(
    MyObject,
    lambda obj, p, cycle: p.text(str(obj) if not cycle else '...')
)

MyObject当然是代表你要自定义打印的类型。请注意,lambda 函数具有与 _repr_pretty_ 相同的签名,并且工作方式相同。