
在 IPython 中,可通过 _repr_pretty_ 与 _ipython_display_ 协同控制对象的显示行为:顶层调用显示完整信息,嵌套时自动精简为占位符(如 <MyObject: ...>),兼顾可读性与简洁性。
在 ipython 中,可通过 `_repr_pretty_` 与 `_ipython_display_` 协同控制对象的显示行为:顶层调用显示完整信息,嵌套时自动精简为占位符(如 `
IPython 的富表示机制支持多层显示协议,其中 _repr_pretty_ 负责结构化缩进渲染(常用于嵌套容器中),而 _ipython_display_ 则在对象作为单元格最终输出(即顶层执行结果)时被优先调用。利用这一优先级差异,即可实现“顶层详尽、嵌套简洁”的差异化展示策略。
具体实现如下:
class MyObject:
def _ipython_display_(self):
# 仅在顶层输出时触发(如直接执行 MyObject())
print("<MyObject: object content>")
def _repr_pretty_(self, p, cycle):
# 在列表、字典、嵌套结构中被调用(如 [MyObject(), ...])
p.text("<MyObject: ...>")✅ 效果验证:
In [1]: MyObject()
Out[1]: <MyObject: object content> # 顶层:完整描述
In [2]: [MyObject(), MyObject()]
Out[2]: [<MyObject: ...>, <MyObject: ...>] # 嵌套:精简占位符
In [3]: {"a": MyObject(), "b": [MyObject()]}
Out[3]: {'a': <MyObject: ...>, 'b': [<MyObject: ...>]} # 多层嵌套同样生效⚠️ 注意事项:
- _ipython_display_ 必须直接输出(如 print() 或调用 IPython.display.display()),不可仅返回字符串;
- 若类已定义 _repr_pretty_ 但未定义 _ipython_display_,IPython 默认回退至 _repr_pretty_ 渲染顶层结果,因此必须显式提供 _ipython_display_ 才能覆盖该行为;
- 避免在 _ipython_display_ 中引发异常或执行耗时操作,否则会影响交互体验;
- 此方案兼容 Jupyter Notebook / Lab 和 IPython 终端,无需额外配置。
这种设计既尊重了用户对顶层结果的语义期待,又防止了嵌套结构因冗余信息导致的视觉污染,是构建专业、易用自定义类型的重要实践。


















