この記事ではRichというPythonモジュールを紹介します。Richは、CLIアプリケーションの出力をリッチに装飾する機能と、ドキュメントやスタックトレースなどをCLI上でリッチに出力する機能を持つ便利なライブラリです。
CLIアプリケーションの開発以外でもデバッグ用途に利用できます。知っておいて損はないライブラリではないかと思います。
基本的な使い方
インタプリタでrich.pretty.install
を実行するとREPLの出力がリッチになります。

一方、スクリプトとして実行する場合は、rich.print
で同様のリッチな出力を得ることができます。
from rich import print
__file__ = "(省略します)"
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
print([False, True, None, 3.14, "Hello World! ", {"foo":"bar"}])

この他にも、Console
クラスを利用すると、様々なリッチな出力を生成することができます。ちなみに、rich.print
関数は、Console
オブジェクトを生成し、そのprint
メソッドを呼び出すためのラッパー関数です。
from rich.console import Console
console = Console()
console.print("Hello, [bold magenta]World[/bold magenta]!")
console.log(":vampire:", log_locals=True)
(lambda: console.log(":vampire:", log_locals=True))()

なおlog
メソッドのlog_locals
は、locals()
の出力のうちダンダー(=ダブルアンダースコアから始まる)変数と値を出力する機能です。デバッグ時などにローカルシンボルの状態を表示するために活用できます。
locals
はPython本体の組み込み関数です。呼び出した時点でのローカルシンボルテーブルを表す辞書を返します。なおlocals
の出力をprint
関数などで表示する場合は、単なる辞書として処理されるためダンダー変数も出力されます。
JSONの表示
Console.print_json
でJSONもリッチに出力できます。
from rich.console import Console
console = Console()
console.print_json('{"abc": 1, "def": {"xyz": [true]}}')

print_json
もrich
モジュールからインポートするためのラッパー関数が定義されています。
例外のスタックトレースの表示
Console.print_exception
で例外発生時のコードやスタックトレース等をリッチに出力できます。コールスタックの各段階の前後のコードやローカル変数の値を表示してくれるため非常に便利です。
from rich.console import Console
__file__ = "(省略します)"
console = Console()
def func(a):
do_something()
try:
func(1)
except Exception as e:
console.print_exception(
extra_lines=3,
show_locals=True,
)

なお、例外ブロック以外でprint_exception
メソッドを呼び出すと、それ自体が例外になるようです。
マークダウンの表示
rich.markdown.Markdown
クラスを利用してマークダウンを整形することもできます。
from rich.console import Console
from rich.markdown import Markdown
md = """
# 概要
このスクリプトはマークダウンをrichで表示するサンプルです。
# 使い方
1. `Markdown`をインポートします。
2. マークダウン形式の文字列を`Markdown`に入力します。
3. `Console.print`で表示します。
"""
console = Console()
console.print(Markdown(md))

クラス・関数の説明
inspect
関数を使用するとクラス・関数の説明を出力することができます。
from rich import inspect
inspect(int, methods=True)
inspect(print, methods=True)

Jupyterでの利用
Jupyter NotebookやJupyterLabでも利用可能です。print
関数はrich.jupyter
からインポートします。

ただし、筆者の環境では、Jupyter Notebookの場合にprint_exception
のスタックトレースが正常に表示されませんでした。また、Jupyter自体の挙動として、ローカルシンボルテーブルがセル全体で共有されていたり、ライブラリが自動定義したシンボルがバインドされていたりと、locals()
の表示に関しては使いづらいです。
バージョン情報
この記事のコードは以下のバージョンのライブラリで検証しました。
- rich==11.2.0