【问题标题】:Pretty print by default in Python REPLPython REPL 中默认的漂亮打印
【发布时间】:2013-06-19 08:39:21
【问题描述】:

如何在 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 模块

【问题讨论】:

    标签: python read-eval-print-loop


    【解决方案1】:

    使用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}
    

    【讨论】:

    • 有没有办法在运行时而不是启动时实现它?原因是我正在调试一些非常大的东西。而且我通过在 shell 中写字已经加载了很多东西。
    • @shiplu.mokadd.im,我更新了代码。使用pprint_on()/pprint_off()
    • 自定义钩子中设置__builtins__._ = value的原因是什么?
    • @l4mpi,默认sys.displayhook 这样做。所以我模仿了这种行为。
    • 无需保存orig_displayhook。这已经保存为sys.__displayhook__
    【解决方案2】:

    使用IPython外壳:

    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,比如tab-completion、多行粘贴、运行shell命令等。所以,它比普通的python shell要好得多。

    【讨论】:

      【解决方案3】:

      基于falsetru's 接受的答案,但采用单线形式:

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

      并切换回来(基于 kyrill 的评论):

      sys.displayhook = sys.__displayhook__
      

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 2014-05-12
        • 1970-01-01
        • 2012-03-25
        • 2020-11-10
        • 2019-04-23
        • 2017-12-19
        相关资源
        最近更新 更多