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

Dan*_*ank 6 repr ipython

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

__repr__在给定合适的环境的情况下,应该生成一个可用于重建对象的唯一字符串.这不同于__str__,它应该产生人类可读的输出.

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

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

Dav*_*d Z 8

这当然是可能的; 你只需要实现实例方法_repr_pretty_(self).这在文档中IPython.lib.pretty有描述.它的实现看起来像这样:

class MyObject:
    def _repr_pretty_(self, p, cycle):
       p.text(str(self) if not cycle else '...')
Run Code Online (Sandbox Code Playgroud)

p参数是一个实例IPython.lib.pretty.PrettyPrinter,您应使用其方法输出要格式化的对象的文本表示形式.通常,您将使用p.text(text)仅将给定的text逐字添加到格式化表示中,但如果您的类表示集合,则可以执行诸如开始和结束组之类的操作.

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


作为奖励,如果你想为你无法访问(或者更准确地,不想)修改代码的类执行此操作,或者如果您只是想进行临时更改以进行测试,那么可以使用IPython显示格式化程序的for_type方法,如此自定义int显示示例所示.在你的情况下,你会使用

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

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