gpt4 book ai didi

ipython - 告诉 IPython 使用对象的 `__str__` 而不是 `__repr__` 进行输出

转载 作者:行者123 更新时间:2023-12-02 02:07:29 25 4
gpt4 key购买 nike

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

__repr__应该产生一个唯一的字符串,在适当的环境下可以用来重建一个对象。这与 __str__ 不同,它应该产生人类可读的输出。

现在假设我们已经编写了一个特定的类,并且希望 IPython 默认生成人类可读的输出(即无需显式调用 print__str__ )。我们不想通过让我们类(class)的 __repr__ 来捏造它。做__str__的工作。这将违反规则。

有没有办法告诉IPython调用__str__默认情况下对于特定类?

最佳答案

这当然是可能的;您只需要实现实例方法_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 参数是一个 bool 值,指示是否检测到引用循环 - 也就是说,是否尝试在同一调用堆栈中两次格式化对象(这会导致无限循环) )。根据您使用的对象类型,可能有必要也可能没有必要考虑它,但这并没有坏处。

<小时/>

作为奖励,如果您想对您无权访问(或者更准确地说,不想)修改代码的类执行此操作,或者您只是想要进行临时更改以进行测试,可以使用 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_ 相同的签名,并且工作方式相同。

关于ipython - 告诉 IPython 使用对象的 `__str__` 而不是 `__repr__` 进行输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41453624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com