Python REPL 默认情况下如何实现漂亮的打印输出?

22

我如何默认启用REPL上的漂亮打印?

目前,我使用pprint.pprint()函数来实现它。

>>> pprint.pprint(data)
{'SHIP_CATEGORY': '',
 'SHIP_QUANTITY': 1,
 'SHIP_SEPARATELY': 0,
 'SHIP_SUPPLEMENT': 0,
 'SHIP_SUPPLEMENT_ONCE': 0,
 'THUMBNAIL': ''}

但我希望默认情况下进行漂亮的打印

>>> data
{'SHIP_CATEGORY': '',
 'SHIP_QUANTITY': 1,
 'SHIP_SEPARATELY': 0,
 'SHIP_SUPPLEMENT': 0,
 'SHIP_SUPPLEMENT_ONCE': 0,
 'THUMBNAIL': ''}

我尝试了什么?
我在谷歌上搜索,但没有找到合适的结果,大多数结果都指向了 pprint 模块。

3个回答

27

使用sys.displayhook

import pprint
import sys

orig_displayhook = sys.displayhook

def myhook(value):
    if value != None:
        __builtins__._ = value
        pprint.pprint(value)

__builtins__.pprint_on = lambda: setattr(sys, 'displayhook', myhook)
__builtins__.pprint_off = lambda: setattr(sys, 'displayhook', orig_displayhook)

如果你不想每次运行交互式Shell时都输入它,请将上述代码放到PYTHONSTARTUP中。

用法:

>>> data = dict.fromkeys(range(10))
>>> data
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}
>>> pprint_on()
>>> data
{0: None,
 1: None,
 2: None,
 3: None,
 4: None,
 5: None,
 6: None,
 7: None,
 8: None,
 9: None}
>>> pprint_off()
>>> data
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}

1
@shiplu.mokadd.im,我更新了代码。使用pprint_on()/pprint_off() - falsetru
当我尝试使用__builtins__._时,出现错误:AttributeError: 'dict' object has no attribute '_'。当我使用__builtins__['_']时,一切正常。 - Joe
@Joe,我可以问一下你使用的Python实现和版本是哪个吗? - falsetru
@Joe,没关系。Python 2 __builtin__ 模块文档Python 3 builtins 模块文档提到了这一点。大多数模块都将名称__builtins__(注意有“s”)作为其全局变量之一。__builtins__的值通常是此模块或此模块的__dict__属性的值。 - falsetru
1
不需要保存 orig_displayhook。它已经保存为 sys.__displayhook__ - kyrill
显示剩余6条评论

11
使用 IPython shell:
In [10]: data = {'SHIP_CATEGORY': '',  'SHIP_QUANTITY': 1, 'SHIP_SEPARATELY': 0, 'SHIP_SUPPLEMENT': 0, 'SHIP_SUPPLEMENT_ONCE': 0,}

In [11]: data
Out[11]: 
{'SHIP_CATEGORY': '',
 'SHIP_QUANTITY': 1,
 'SHIP_SEPARATELY': 0,
 'SHIP_SUPPLEMENT': 0,
 'SHIP_SUPPLEMENT_ONCE': 0}

它还有一个选项--no-pprint,以便您可以禁用此漂亮的打印输出。 IPython shell还具有features,如制表符补全、多行粘贴、运行shell命令等。因此,它比普通的python shell要好得多。

3

基于 falsetru 的答案,但以一行代码的形式呈现:

from pprint import pprint
import sys

sys.displayhook = lambda x: exec(['_=x; pprint(x)','pass'][x is None])

并且要切换回去(基于Kyrill的评论):

sys.displayhook = sys.__displayhook__

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接