使对象的美观打印在顶层与嵌套时不同

1 投票
2 回答
41 浏览
提问于 2025-04-14 17:14

在IPython中,可以让一个对象有自定义的漂亮打印显示,具体可以参考这个链接:如何在IPython中美化对象的显示

class MyObject:
    def _repr_pretty_(self, p, cycle):
        p.text("<MyObject: object content>")

然后在命令行中,打印出来的效果会是:

In [5]: MyObject()
Out[5]: <MyObject: object content>

不过,如果在列表、字典等地方出现多个MyObject()对象,显示的内容可能会变得很长。

In [6]: [MyObject(), MyObject()]
Out[6]: [<MyObject: object content>, <MyObject: object content>]

我想要实现以下功能:

  • 如果MyObject()出现在最外层,就显示上面那种详细描述。
  • 如果它出现在嵌套的地方,则显示为<MyObject: ...>

我的想法是:内容太多会让用户看得很乱,如果用户想查看里面的详细信息,可以直接输入list[0]来查看。

我该如何在IPython命令行中实现这个功能?或者,有没有更好的解决方案?

2 个回答

0

我找到的另一种方法是访问 p.group_stack。不过,遗憾的是,关于 group_stack 的具体信息我找不到,所以使用的时候要自己小心。

class MyObject:
    def _repr_pretty_(self, p, cycle):
        if len(p.group_stack)>2:
            p.text("<MyObject: ...>")
        else:
            p.text("<MyObject: object content>")

输出结果是符合预期的。

In [2]: MyObject()
Out[2]: <MyObject: object content>

In [3]: [MyObject(), MyObject()]
Out[3]: [<MyObject: ...>, <MyObject: ...>]
1

你可以定义一个叫做 _ipython_display_() 的函数。

class MyObject:
    def _ipython_display_(self):
        print("<MyObject: object content>")

    def _repr_pretty_(self, p, cycle):
        p.text("<MyObject: ...>")
In [20]: MyObject()
Out[20]: <MyObject: object content>

In [21]: [MyObject(), MyObject()]
Out[21]: [<MyObject: ...>, <MyObject: ...>]

撰写回答