Richの使い方

この記事では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_jsonrichモジュールからインポートするためのラッパー関数が定義されています。

例外のスタックトレースの表示

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
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

ITベンチャーでデータ分析、AI開発、システム設計、提案、営業、組織管理、公演、採用などなど多数の役割に従事してきました。

様々な職業や背景の方々と交流するうちに、幅広い分野で問題を解決したり価値を生み出したりするためには、個別の知識だけでなく、汎用的に物事を考える力を伸ばしていく必要があると考えるようになりました。

更に、自分自身の考える力だけでなく、より多くの人々の考える力のトレーニングを応援することで、社会全体を良くしていけるのではないかと考えて、このサイトを作りました。

目次
閉じる