默认情况下,当IPython显示一个对象时,它似乎使用__repr__
。
__repr__
应该产生一个唯一的字符串,可以用来重建一个对象。
这与__str__
不同,后者应该产生人类可读的输出。
现在假设我们已经编写了一个特定的类,我们希望IPython默认生成人类可读输出(即没有明确调用print
或__str__
)。
我们不想通过让我们班级__repr__
做__str__
的工作来捏造它。
这将破坏规则。
有没有办法告诉IPython默认为特定类调用__str__
?
答案 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_
相同的签名,并且工作方式相同。