PythonでターミナルをRichにする


PythonでターミナルをRichにする

ターミナルは暗い。Pythonでバックエンド開発をしていると日々真っ暗な画面を凝視することになり、性格も人生も暗くなります。

そこに光明を差すライブラリを見つけました。Richです。Richを使うことによって、真っ暗なターミナルを色とりどりのフォントと絵文字で明るい人生を送ることができるようになります。

What is Rich?

Richはターミナルにリッチなテキストを美しく整形して出力するPythonライブラリです。
Pythonの標準出力、ログの両方をきれいに表示することができるようになります。しかも絵文字も使えます。

Richは以下で公開されています。

Richになりましょう!

Rich入門

インストールは簡単です。すぐRichになれます。

pip install rich

これでRichになれました。続いてRichな生き方を学びましょう。
以下でRichな生き方が示されます。

python -m rich

すごいRichです。

Rich生活

もう少しRichになってみましょう。標準出力をRichにします。

import rich
from rich import pretty, print
from rich.console import Console

console = Console()
pretty.install()

print(1, 0.4, "I am Rich!", "私はRich!", ":smiley:")
console.print(1, 0.4, "I am Rich!", "私はRich!", ":smiley:")

print([1, 2, 3])
print({"a": 0, "b": 1, "c": "a1<aa>", "rich": rich})

とてもRichです! 絵文字が輝いています!
Richは更に、クラスや関数をフォーマットして表示してくれます。intをinspectして表示してみましょう。

from rich import pretty, print, inspect
from rich.console import Console

console = Console()
pretty.install()

print(inspect(int, methods=True))

コンソールログを使えば更にRichなフォーマットで表示することができます。

from rich import pretty, print
from rich.console import Console

console = Console()
pretty.install()

test_data = [
    {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True]},
    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
    {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23]},
]

console.log("Hello from", console, "!")
console.log(test_data, log_locals=True)

本番で使うRich

本番でもRichになるために、例外やloggingフォーマットもRichにしたいと思います。

例外もRichに表示することができます。

from rich import pretty, print
from rich.console import Console

console = Console()
pretty.install()

try:
    print(1 / 0)
except Exception as e:
    console.print_exception(extra_lines=5, show_locals=True)

エラー内容がすーぱーRichになっています。絶対に見落とすことは有りません。

そしてRichはLoggingHandlerもRichに提供しています。

import rich
from rich import pretty, print
from rich.console import Console
import time
import logging
from rich.logging import RichHandler

logging.basicConfig(
    level=logging.DEBUG,
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True)],
)

log = logging.getLogger("rich")
log.info("Hello, World!")


def div(divisor: int, divident: int) -> float:
    return divisor / divident


def main():
    try:
        a = div(2, 1)
        log.info(f"2 / 1 = {a}")

        b = div(1, 0)
        log.info(f"1 / 0 = {b}")
    except Exception as e:
        log.exception("Rich error!")


if __name__ == "__main__":
    main()

ログがRichになりました!
エラーもRichログ仕様になり、可読性の高いエラーになっています。

終わRich

というわけでRichでした。みなさまもRichを使って年末年始をRichに過ごしてください。良いお年を!