【问题标题】:Tell IPython to use an object's `__str__` instead of `__repr__` for output告诉 IPython 使用对象的 `__str__` 而不是 `__repr__` 进行输出
【发布时间】:2017-05-18 03:24:50
【问题描述】:

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

__repr__ 应该产生一个唯一的字符串,该字符串可用于在正确的环境下重建对象。 这与 __str__ 不同,后者应该产生人类可读的输出。

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

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

【问题讨论】:

标签: ipython repr


【解决方案1】:

这当然是可能的;你只需要实现实例方法_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_ 相同的签名,并且工作方式相同。

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2011-04-11
    • 2016-07-09
    • 1970-01-01
    相关资源
    最近更新 更多