pprintとrichで快適デバッグ【list型やdict型を整形してターミナルを見やすく改善】

## はじめに
ある変数に想定データが入っているかどうかを確認をする際、私は今までターミナルに`print`で出力していました。

少ないデータを見るときは`print`で十分なのですが、何百件ほどあるデータを見るときは、何も改行・インデントがないため探したいデータを見つけるのに一苦労です。

そこで今回は、ターミナル内の**list型**や**dict型**変数を整形して見やすく改善できる`pprint`や更に見やすくできる`rich`をご紹介致します。

## pprintとは？

`pprint`はPython標準ライブラリに含まれているPretty Printモジュールです。通常の`print`関数だと複雑なデータ構造が一行に詰め込まれて読みにくくなりますが、`pprint`を使うと見やすい形に整形して表示してくれます。

## pprintの使い方

例えば、下記のような複雑な構造をしたdict型の変数`data`について考えます。

```python
import pprint

# 複雑なネスト構造を持つ辞書を定義
data = {
    "users": [
        {"id": 1, "name": "Alice", "roles": ["admin", "editor"]},
        {"id": 2, "name": "Bob", "roles": ["viewer"]},
        {"id": 3, "name": "Charlie", "roles": ["editor", "viewer"]},
    ],
    "settings": {
        "theme": "dark",
        "notifications": {"email": True, "sms": False},
        "features": ["feature1", "feature2", "feature3"],
    },
    "logs": [
        {"timestamp": "2024-11-27T10:00:00", "action": "login", "user": "Alice"},
        {"timestamp": "2024-11-27T10:05:00", "action": "view", "user": "Bob"},
    ],
}

print('pprintを用いない場合')
print(data)

print('pprintを用いた場合')
pprint.pprint(data)

```
```console
・出力結果
pprintを用いない場合
{'users': [{'id': 1, 'name': 'Alice', 'roles': ['admin', 'editor']}, {'id': 2, 'name': 'Bob', 'roles': ['viewer']}, {'id': 3, 'name': 'Charlie', 'roles': ['editor', 'viewer']}], 'settings': {'theme': 'dark', 'notifications': {'email': True, 'sms': False}, 'features': ['feature1', 'feature2', 'feature3']}, 'logs': [{'timestamp': '2024-11-27T10:00:00', 'action': 'login', 'user': 'Alice'}, {'timestamp': '2024-11-27T10:05:00', 'action': 'view', 'user': 'Bob'}]}

pprintを用いた場合
{'logs': [{'action': 'login',
           'timestamp': '2024-11-27T10:00:00',
           'user': 'Alice'},
          {'action': 'view',
           'timestamp': '2024-11-27T10:05:00',
           'user': 'Bob'}],
 'settings': {'features': ['feature1', 'feature2', 'feature3'],
              'notifications': {'email': True, 'sms': False},
              'theme': 'dark'},
 'users': [{'id': 1, 'name': 'Alice', 'roles': ['admin', 'editor']},
           {'id': 2, 'name': 'Bob', 'roles': ['viewer']},
           {'id': 3, 'name': 'Charlie', 'roles': ['editor', 'viewer']}]}
```

このように、`pprint`を用いることで冗長に見えていた出力結果が、listの要素毎・dictの要素毎に表示されるようになり、かなり視覚性が向上します。

また、`pprint`はPython標準ライブラリに含まれているため<font color="MediumSlateBlue">インストールなどは不要</font>で冒頭に`import pprint`と記載するだけで使用することができます。

## richとは？

`rich`は、Pythonのターミナル出力をより見やすくするためのライブラリです。  

データを色付きで表示したり、スタイルを追加したりすることができ、ターミナルでのデバッグ作業をより快適にしてくれます。

## richの使い方
まず、`rich`を使うためにはライブラリをインストールする必要があります。以下のコマンドでインストールできます。

```bash
pip install rich
```

その後、richライブラリから必要なモジュールをインポートし、使用します。

```python
# 必要なモジュールをインポート
from rich.console import Console

# 複雑な辞書データの準備
data = {
    "name": "Alice",
    "age": 25,
    "skills": ["Python", "Machine Learning", "Data Analysis"],
    "experience": {
        "company_1": {"name": "sample_company1", "role": "Intern", "years": 1},
        "company_2": {"name": "sample_company2", "role": "Engineer", "years": 3},
    },
    "hobbies": ["Reading", "Cycling", "Gaming"],
}

# 普通の出力（rich を使わない場合）
print("\n=== 普通の出力 ===")
print(data)

# rich を使った出力
console = Console()
console.print("\n[bold yellow]=== Rich を使った出力 ===[/bold yellow]")
console.print(data, highlight=True)

```

・出力結果

![スクリーンショット 2024-12-02 15.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901623/616329ca-4c23-1e14-6e14-3ea9ec207983.png)


このように、`rich`を使わない場合と使った場合では分かりやすさが一目瞭然です。

また、`rich`を使うと以下のような機能を活用できます：
- **カラー出力**：ターミナルに色をつけて、データ構造をより見やすくする
- **テキストのスタイル**：太字やイタリック、下線などのスタイルを使って強調表示
- **テーブル（表）**：表形式でデータをきれいに整形して表示
- **進捗バー**：プログラムの進行状況を視覚的に表示
- **マークダウン表示**：ターミナル内でマークダウンをレンダリングして表示

## pprintとrichの比較と使い分け

### 比較表
| 特徴          | pprint                       | Rich                              |
|---------------|------------------------------|-----------------------------------|
| 標準ライブラリ | ✔                             | ✘（別途インストールが必要）         |
| 色付き表示     | ✘                             | ✔                                 |
| カスタマイズ性 | シンプルで必要最低限          | 高い（カラーやスタイルの変更が可能）|
| 主な用途       | シンプルな整形出力            | 視覚的に綺麗な出力               |

### 使い分けの基準

- **pprint**  
  - シンプルに整形したい場合に便利
  - 標準ライブラリなので追加インストール不要で手軽
  - ネストの浅いデータ構造や単純なデバッグ向け

- **Rich**  
  - 色付きやフォーマットの美しさを重視したい場合に最適
  - 視覚的な見やすさが必要なデバッグやデータ可視化に活躍
  - ターミナル環境に依存するが、より分かりやすい出力が可能

## 最後に
見やすいターミナルを構築することで作業効率が大幅にUPすると思います。
「他にも、こんな方法があるよ」という意見がある方はぜひ教えて下さい。