告诉IPython使用一个对象的`
默认情况下,当IPython显示一个对象时,它似乎使用__repr__
。
给定正确的环境, __repr__
应该产生一个唯一的字符串,可以用来重建对象。 这与__str__
不同,后者应该产生人类可读的输出。
现在假设我们已经编写了一个特定的类,并且我们希望IPython默认生成人类可读的输出(即不显式调用print
或__str__
)。 我们不想通过让我们班的__repr__
做__str__
的工作来改变它。 这将违反规则。
有没有办法告诉IPython默认为特定的类调用__str__
?
这当然是可能的; 你只需要实现实例方法_repr_pretty_(self)
。 这在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
方法,如自定义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_
相同的签名,并且工作方式相同。
上一篇: Tell IPython to use an object's `
下一篇: When I am in the Python or IPython console, what is called when I am returned an output?