告诉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_相同的签名,并且工作方式相同。

链接地址: http://www.djcxy.com/p/4853.html

上一篇: 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?