pytermgui.pretty
This module calls install() on import, and defines print as pprint.
It allows setting up pretty print functionality in only one line.
Usage
>>> from pytermgui.pretty import print
1"""This module calls `install()` on import, and defines `print` as `pprint`. 2 3It allows setting up pretty print functionality in only one line. 4 5Usage: 6 ```python3 7 >>> from pytermgui.pretty import print 8 ``` 9""" 10 11# isort: skip_file 12 13from __future__ import annotations 14 15import builtins 16import os 17import sys 18from typing import Any 19 20from .markup import tim 21from .prettifiers import prettify 22from .terminal import get_terminal 23 24try: 25 # Try to get IPython instance. This function is provided by the 26 # IPython runtime, so if running outside of that context a NameError 27 # is raised. 28 IPYTHON = get_ipython() # type: ignore 29 from IPython.core.formatters import ( # type: ignore # pylint: disable=import-error 30 BaseFormatter, 31 ) 32 33except NameError: 34 IPYTHON = None 35 BaseFormatter = object 36 37 38NO_WELCOME = ( 39 os.getenv("PTG_SILENCE_PRETTY") is not None or not get_terminal().is_interactive() 40) 41 42__all__ = ["pprint", "install"] 43 44 45def pprint( 46 *items: Any, 47 indent: int = 2, 48 expand_all: bool = False, 49 force_markup: bool = False, 50 parse: bool = True, 51 **print_args: Any, 52) -> None: 53 r"""A wrapper to pretty-print any object. 54 55 This essentially just calls `prettify` on each given object, and passes the 56 `**print_args` right through to print. Note that when the `sep` print argument is 57 ommitted it is manually set to ", \n". 58 59 To customize any of the styles, see `MarkupLanguage.prettify`. 60 61 Args: 62 *items: The items to print. These are passed in the same way they would be into 63 builtin print. 64 indent: The indentation value used for multi-line objects. This is ignored when 65 the given object has a `len() < 2`, and `expand_all is not set.` 66 force_tim: Turn all ANSI-sequences into tim before pretty printing. 67 expand_all: Force-expand containers, even when they would normally be collapsed. 68 **print_args: All arguments passed to builtin print. 69 """ 70 71 if "sep" not in print_args: 72 print_args["sep"] = ", \n" 73 74 pretty = [] 75 for item in items: 76 pretty.append( 77 prettify( 78 item, 79 force_markup=force_markup, 80 indent=indent, 81 expand_all=expand_all, 82 parse=parse, 83 ) 84 ) 85 86 get_terminal().print(*pretty, **print_args) 87 88 89def install( 90 indent: int = 2, force_markup: bool = False, expand_all: bool = False 91) -> None: 92 """Sets up `pprint` to print all REPL output. IPython is also supported. 93 94 This functions sets up a hook that will call `pprint` after every interactive 95 return. The given arguments are passed directly to `pprint`, so for more information 96 you can check out that function. 97 98 Usage is pretty simple: 99 100 ```python3 101 >>> from pytermgui import pretty 102 >>> tim.setup_displayhook() 103 >>> # Any function output will now be prettified 104 ``` 105 106 ...or alternatively, you can import `print` from `pytermgui.pretty`, 107 and have it automatically set up, and replace your namespace's `print` 108 function with `tim.pprint`: 109 110 ```python3 111 >>> from pytermgui.pretty import print 112 ... # Under the hood, the above is called and `tim.pprint` is set 113 ... # for the `print` name 114 >>> # Any function output will now be prettified 115 ``` 116 117 Args: 118 indent: The indentation value used for multi-line objects. This is ignored when 119 the given object has a `len() < 2`, and `expand_all is not set.` 120 force_tim: Turn all ANSI-sequences into tim before pretty printing. 121 expand_all: Force-expand containers, even when they would normally be collapsed. 122 """ 123 124 def _hook(value: Any) -> None: 125 if value is None: 126 return 127 128 pprint(value, force_markup=force_markup, indent=indent, expand_all=expand_all) 129 130 # Sets up "_" as a way to access return value, 131 # inkeeping with sys.displayhook 132 builtins._ = value # type: ignore 133 134 if IPYTHON is not None: 135 IPYTHON.display_formatter.formatters["text/plain"] = PTGFormatter( 136 force_markup=force_markup, indent=indent, expand_all=expand_all 137 ) 138 139 else: 140 sys.displayhook = _hook 141 142 if not NO_WELCOME: 143 with get_terminal().no_record(): 144 builtins.print() 145 tim.print("[113 bold]Successfully set up prettification!") 146 tim.print("[245 italic]> All function returns will now be pretty-printed,") 147 builtins.print() 148 pprint("[245 italic]Including [/italic 210]Markup!") 149 builtins.print() 150 151 get_terminal().displayhook_installed = True 152 153 154class PTGFormatter(BaseFormatter): # pylint: disable=too-few-public-methods 155 """An IPython formatter for PTG pretty printing.""" 156 157 def __init__(self, **kwargs: Any) -> None: 158 """Initializes PTGFormatter, storing **kwargs.""" 159 160 super().__init__() 161 162 self.kwargs = kwargs 163 164 def __call__(self, value: Any) -> None: 165 """Pretty prints the given value, as well as a leading newline. 166 167 The newline is needed since IPython output is prepended with 168 "Out[i]:", and it might mess alignments up. 169 """ 170 171 builtins.print("\n") 172 pprint(value, **self.kwargs) 173 174 # Sets up "_" as a way to access return value, 175 # inkeeping with sys.displayhook 176 builtins._ = value # type: ignore 177 178 179# I am normally violently against shadowing builtins, but this is an optional, 180# (hopefully always) REPL-only name, only provided for convenience. 181print = pprint # pylint: disable=redefined-builtin 182 183install()
46def pprint( 47 *items: Any, 48 indent: int = 2, 49 expand_all: bool = False, 50 force_markup: bool = False, 51 parse: bool = True, 52 **print_args: Any, 53) -> None: 54 r"""A wrapper to pretty-print any object. 55 56 This essentially just calls `prettify` on each given object, and passes the 57 `**print_args` right through to print. Note that when the `sep` print argument is 58 ommitted it is manually set to ", \n". 59 60 To customize any of the styles, see `MarkupLanguage.prettify`. 61 62 Args: 63 *items: The items to print. These are passed in the same way they would be into 64 builtin print. 65 indent: The indentation value used for multi-line objects. This is ignored when 66 the given object has a `len() < 2`, and `expand_all is not set.` 67 force_tim: Turn all ANSI-sequences into tim before pretty printing. 68 expand_all: Force-expand containers, even when they would normally be collapsed. 69 **print_args: All arguments passed to builtin print. 70 """ 71 72 if "sep" not in print_args: 73 print_args["sep"] = ", \n" 74 75 pretty = [] 76 for item in items: 77 pretty.append( 78 prettify( 79 item, 80 force_markup=force_markup, 81 indent=indent, 82 expand_all=expand_all, 83 parse=parse, 84 ) 85 ) 86 87 get_terminal().print(*pretty, **print_args)
A wrapper to pretty-print any object.
This essentially just calls prettify on each given object, and passes the
**print_args right through to print. Note that when the sep print argument is
ommitted it is manually set to ", \n".
To customize any of the styles, see MarkupLanguage.prettify.
Args
- *items: The items to print. These are passed in the same way they would be into builtin print.
- indent: The indentation value used for multi-line objects. This is ignored when
the given object has a
len() < 2, andexpand_all is not set. - force_tim: Turn all ANSI-sequences into tim before pretty printing.
- expand_all: Force-expand containers, even when they would normally be collapsed.
- **print_args: All arguments passed to builtin print.
90def install( 91 indent: int = 2, force_markup: bool = False, expand_all: bool = False 92) -> None: 93 """Sets up `pprint` to print all REPL output. IPython is also supported. 94 95 This functions sets up a hook that will call `pprint` after every interactive 96 return. The given arguments are passed directly to `pprint`, so for more information 97 you can check out that function. 98 99 Usage is pretty simple: 100 101 ```python3 102 >>> from pytermgui import pretty 103 >>> tim.setup_displayhook() 104 >>> # Any function output will now be prettified 105 ``` 106 107 ...or alternatively, you can import `print` from `pytermgui.pretty`, 108 and have it automatically set up, and replace your namespace's `print` 109 function with `tim.pprint`: 110 111 ```python3 112 >>> from pytermgui.pretty import print 113 ... # Under the hood, the above is called and `tim.pprint` is set 114 ... # for the `print` name 115 >>> # Any function output will now be prettified 116 ``` 117 118 Args: 119 indent: The indentation value used for multi-line objects. This is ignored when 120 the given object has a `len() < 2`, and `expand_all is not set.` 121 force_tim: Turn all ANSI-sequences into tim before pretty printing. 122 expand_all: Force-expand containers, even when they would normally be collapsed. 123 """ 124 125 def _hook(value: Any) -> None: 126 if value is None: 127 return 128 129 pprint(value, force_markup=force_markup, indent=indent, expand_all=expand_all) 130 131 # Sets up "_" as a way to access return value, 132 # inkeeping with sys.displayhook 133 builtins._ = value # type: ignore 134 135 if IPYTHON is not None: 136 IPYTHON.display_formatter.formatters["text/plain"] = PTGFormatter( 137 force_markup=force_markup, indent=indent, expand_all=expand_all 138 ) 139 140 else: 141 sys.displayhook = _hook 142 143 if not NO_WELCOME: 144 with get_terminal().no_record(): 145 builtins.print() 146 tim.print("[113 bold]Successfully set up prettification!") 147 tim.print("[245 italic]> All function returns will now be pretty-printed,") 148 builtins.print() 149 pprint("[245 italic]Including [/italic 210]Markup!") 150 builtins.print() 151 152 get_terminal().displayhook_installed = True
Sets up pprint to print all REPL output. IPython is also supported.
This functions sets up a hook that will call pprint after every interactive
return. The given arguments are passed directly to pprint, so for more information
you can check out that function.
Usage is pretty simple:
>>> from pytermgui import pretty
>>> tim.setup_displayhook()
>>> # Any function output will now be prettified
...or alternatively, you can import print from pytermgui.pretty,
and have it automatically set up, and replace your namespace's print
function with tim.pprint:
>>> from pytermgui.pretty import print
... # Under the hood, the above is called and `tim.pprint` is set
... # for the `print` name
>>> # Any function output will now be prettified
Args
- indent: The indentation value used for multi-line objects. This is ignored when
the given object has a
len() < 2, andexpand_all is not set. - force_tim: Turn all ANSI-sequences into tim before pretty printing.
- expand_all: Force-expand containers, even when they would normally be collapsed.