告诉IPython使用一个对象的`__str __而不是`__repr__`来输出

时间:2017-01-03 22:52:56

标签: ipython repr

默认情况下,当IPython显示一个对象时,它似乎使用__repr__

在适当的环境下,

__repr__应该产生一个唯一的字符串,可以用来重建一个对象。 这与__str__不同,后者应该产生人类可读的输出。

现在假设我们已经编写了一个特定的类,我们希望IPython默认生成人类可读输出(即没有明确调用print__str__)。 我们不想通过让我们班级__repr____str__的工作来捏造它。 这将破坏规则。

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

1 个答案:

答案 0 :(得分:8)

这当然是可能的;你只需要实现实例方法_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逐字添加到格式化的表示中,但如果您的类表示集合,则可以执行诸如开始和结束组之类的操作。

cycle参数是一个布尔值,表示是否检测到引用周期 - 也就是说,您是否尝试在同一个调用堆栈中对对象进行两次格式化(这会导致无限循环) 。根据您使用的对象类型,可能需要或可能没有必要考虑它,但它不会受到伤害。

作为奖励,如果您想为那些您可以访问(或更准确地说,不想)修改的代码的人执行此操作,或者如果您只想临时更改测试,可以使用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_相同的签名,并且工作方式相同。