
在 IPython 中,可通过组合 _repr_pretty_ 与 _ipython_display_ 方法,使对象在顶层输出时显示完整信息,而在列表、字典等嵌套结构中自动简化为紧凑形式(如 <MyObject: ...>),兼顾可读性与简洁性。
在 ipython 中,可通过组合 `_repr_pretty_` 与 `_ipython_display_` 方法,使对象在顶层输出时显示完整信息,而在列表、字典等嵌套结构中自动简化为紧凑形式(如 `
IPython 的富表达协议提供了多层控制机制:_repr_pretty_ 负责通用缩进式美化输出(被 pprint 或嵌套容器调用),而 _ipython_display_ 则专用于顶层执行结果的直接渲染(即 Out[N] 显示)。二者协同即可实现「顶层详尽、嵌套精简」的效果。
具体实现如下:
class MyObject:
def _repr_pretty_(self, p, cycle):
# 所有嵌套场景(list/dict/tuple/自定义容器等)均走此方法
p.text("<MyObject: ...>")
def _ipython_display_(self):
# 仅当对象作为单元格最终返回值(顶层)时被调用
print("<MyObject: object content>")✅ 效果验证:
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_ 应避免副作用(如修改状态、IO 阻塞),且不返回值(仅负责输出);
- 若需支持 Jupyter Notebook 的 HTML/Math 等富媒体,可在此方法中调用 IPython.display.display();
- 不要仅依赖 _repr_pretty_ 实现差异化——它无上下文感知能力,无法区分顶层/嵌套;
- 此方案兼容 IPython 7.0+ 及主流 Jupyter 环境,无需额外配置。
该设计遵循“最小惊讶原则”:用户一眼识别出对象类型,细节按需展开,既保持 REPL 流畅性,又不失调试深度。


















