告诉IPython使用对象';输出为s`\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

告诉IPython使用对象';输出为s`\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,ipython,repr,Ipython,Repr,默认情况下,当IPython显示一个对象时,它似乎使用\uuuu repr\uuu \uuuu repr\uuuu应该生成一个唯一的字符串,该字符串可以用于在适当的环境下重建对象。 这与\uuuu str\uuuu不同,后者应该产生人类可读的输出 现在假设我们已经编写了一个特定的类,并且希望IPython在默认情况下生成人类可读的输出(即,不显式调用print或\uu str)。 我们不想通过让我们班的\uuuuu repr\uuuuuu做\uuuu str\uuuu的工作来蒙混过关。 那就是违

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

\uuuu repr\uuuu
应该生成一个唯一的字符串,该字符串可以用于在适当的环境下重建对象。 这与
\uuuu str\uuuu
不同,后者应该产生人类可读的输出

现在假设我们已经编写了一个特定的类,并且希望IPython在默认情况下生成人类可读的输出(即,不显式调用
print
\uu str
)。 我们不想通过让我们班的
\uuuuu repr\uuuuuu
\uuuu str\uuuu
的工作来蒙混过关。 那就是违反规则


有没有办法告诉IPython在默认情况下为特定类调用
\uuu str\uuuu
;您只需要实现实例方法
\u repr\u pretty\u(self)
。这在中进行了描述。其实现可以如下所示:

class MyObject:
    def _repr_pretty_(self, p, cycle):
       p.text(str(self) if not cycle else '...')
p
参数是的一个实例,您应该使用其方法输出正在格式化的对象的文本表示形式。通常,您将使用
p.text(text)
,它只是将给定的
text
逐字添加到格式化表示中,但如果您的类表示集合,则可以执行诸如开始组和结束组之类的操作

cycle
参数是一个布尔值,指示是否检测到引用循环,也就是说,是否尝试在同一调用堆栈中格式化对象两次(这会导致无限循环)。根据你使用的是哪种类型的物体,可能不需要考虑它,但是它不会造成伤害。
作为奖励,如果您想对其代码无法访问(或者更准确地说,不想修改)的类执行此操作,或者如果您只是想对测试进行临时更改,则可以使用IPython display formatter的
for_type
方法,如中所示。在您的情况下,您将使用

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

当然,使用
MyObject
表示要自定义打印的类型。请注意,lambda函数带有与
\u repr\u pretty\u
相同的签名,并且以相同的方式工作。

相关:据我所知,“通常”的解决方案是只编写一个奇怪的
\u repr\u
。例如,熊猫数据帧就是这样做的。@user2357112 Awww:-(