使对象的美观打印在顶层与嵌套时不同
在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: ...>]