Search code examples
pythonread-eval-print-loop

Pretty print by default in Python REPL


How can i enable pretty print on the REPL by default?

Currently I do it by using pprint.pprint() function.

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

But I want pretty print by default

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

What have I tried?
I searched on google. Didn't found anything most result points to pprint module


Solution

  • Use 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)
    

    Put Above code to PYTHONSTARTUP if you don't want type it every time you run interactive shell.

    Usage:

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