重要
本文档涵盖 IPython 6.0 及更高版本。从 6.0 版本开始,IPython 不再支持与低于 3.3 的 Python 版本(包括所有版本的 Python 2.7)的兼容性。
如果您正在寻找与 Python 2.7 兼容的 IPython 版本,请使用 IPython 5.x LTS 版本并参阅其文档(LTS 是长期支持版本)。
将对象与 IPython 集成¶
制表符补全¶
要更改对象制表符补全时显示的属性,请为其定义一个 __dir__(self)
方法。有关更多详细信息,请参阅内置 dir() 函数 的文档。
您还可以自定义对象的键补全,例如在 obj["a
后按制表符。为此,请定义一个方法 _ipython_key_completions_()
,它返回一个对象列表,这些对象是下标表达式 obj[key]
中可能的键。
在 5.0 版本中添加: 自定义键补全
丰富显示¶
自定义方法¶
IPython 可以显示更丰富的对象表示形式。为此,您可以定义 _ipython_display_()
或任意数量的 _repr_*_()
方法。请注意,这些方法周围使用的是单下划线,而不是双下划线。
格式 |
REPL |
笔记本 |
Qt 控制台 |
---|---|---|---|
|
是 |
是 |
是 |
|
否 |
是 |
是 |
|
否 |
是 |
是 |
|
否 |
是 |
是 |
|
否 |
是 |
否 |
|
否 |
是 |
否 |
|
否 |
是 |
否 |
|
否 |
是 |
否 |
|
否 |
? |
? |
如果方法不存在,则使用标准 repr()
。如果方法存在并返回 None
,则将其视为不存在。通常,在显示对象时将调用所有可用的格式化程序,并且由 UI 选择要显示哪一个。给定的格式化程序通常不应根据其他可用格式更改其输出 - 这应该在不同的级别(例如 DisplayFormatter
或配置)进行处理。
_repr_*_
方法应返回预期格式的数据,并且没有副作用。例如,_repr_html_
应将 HTML 作为 str
返回,而 _repr_png_
应将 PNG 数据作为 bytes
返回。
如果您希望通过自己的副作用控制显示,请使用 _ipython_display_()
。
例如
class Shout(object):
def __init__(self, text):
self.text = text
def _repr_html_(self):
return "<h1>" + self.text + "</h1>"
特殊方法¶
漂亮打印¶
要自定义对象的漂亮打印方式,请向类中添加 _repr_pretty_
方法。该方法应接受一个漂亮打印机和一个布尔值,该布尔值指示打印机是否检测到循环。该方法应作用于打印机以生成自定义的漂亮输出。这里有一个示例
class MyObject(object):
def _repr_pretty_(self, p, cycle):
if cycle:
p.text('MyObject(...)')
else:
p.text('MyObject[...]')
有关如何使用漂亮打印机的详细信息,请参阅 IPython.lib.pretty
。
更强大的方法¶
元数据¶
我们经常希望为前端提供关于如何显示数据的指导。为了支持这一点,_repr_*_()
方法(除了 _repr_pretty_
?)还可以返回一个 (data, metadata)
元组,其中 metadata
是一个包含任意键值对的字典,供前端解释。一个示例用例是 _repr_jpeg_()
,它可以设置为返回一个 jpeg 图像和一个 {'height': 400, 'width': 600}
字典,以告知前端如何调整图像大小。
第三方类型的格式化程序¶
用户还可以为类型注册格式化程序,而无需修改类
from bar.baz import Foo
def foo_html(obj):
return '<marquee>Foo object %s</marquee>' % obj.name
html_formatter = get_ipython().display_formatter.formatters['text/html']
html_formatter.for_type(Foo, foo_html)
# Or register a type without importing it - this does the same as above:
html_formatter.for_type_by_name('bar.baz', 'Foo', foo_html)
自定义异常跟踪¶
在极少数情况下,您可能希望在报告异常时显示自定义跟踪。为此,请使用 _render_traceback_(self)
方法定义自定义跟踪,该方法返回一个字符串列表,每个字符串对应跟踪中的一行。例如,ipyparallel 是 IPython 的并行计算框架,它执行此操作以显示来自多个引擎的错误。
请保守地使用此功能;通过替换默认跟踪,您可能会向用户隐藏重要信息。