IPython - 让打印默认显示长变量的头尾
(仅适用于在IPython中工作,无论是终端还是QTConsole,不适用于Notebook)有没有办法让普通的打印语句(是的,2.7版本)在变量超过某个大小时,自动只打印出头部和尾部(或者仅打印头部)呢?
如果我用print dataframe
打印一个太大的pandas数据框,pandas会自动只打印出前面的部分。我希望在列表和numpy数组上也能这样,这样下次我不小心打印一个巨大的数组时,就不会看到100页的数字了。(我知道我可以写一个函数来实现这个,但我习惯性地使用打印,所以我想知道有没有办法控制IPython显示多少内容——其实,我更希望能改变控制台显示的内容,而不是程序本身的输出。)
1 个回答
你用 print
语句能做的事情不多,但你可以对 ipython
的输出做点文章,看看这两个命令:
In [13]: x = range(3)
In [14]: x
Out[14]: [0, 1, 2]
In [15]: print x
[0, 1, 2]
首先,x
会把 Out[14]
的值赋给表达式,然后显示这个 Out[14]
。
你可以对 ipython
进行一些修改,让它以不同的方式显示输出。根据我的了解,ipython
内部使用了 pprint
或者它的一个副本。不过,简单地修改 pprint.pprint/pprint.pformat/pprint.PrettyPrinter
是不够的,你需要对 ipython
进行更深入的修改。
其次,print x
直接触及了 Python 的核心。在 Python 2.x 中,你无法改变 print
的行为。而在 Python 3.x 中,print()
只是一个函数,你可以对它进行修改。
如果你打印的是你自己定义的类的对象,可以像 numpy 那样重新定义 __str__
和 __repr__
:
numpy.set_printoptions(threshold=2)
numpy.array(range(10)).__str__()
'[0 1 2 ..., 7 8 9]'
print numpy.array(range(10))
[0 1 2 ..., 7 8 9]
最后,ipython
还提供了一个 %page
的魔法命令,你可以输入 %page x
,如果 x
的表示内容足够大,你会被带到一个 less
或类似的分页工具中,这样你就可以一页一页地查看这个文本表示。
附注:ipython
可以通过“traits”进行扩展,这对我来说仍然是个谜,但也许你可以用 traits 来解决第一个问题。