Pythonでデータ構造を可視化するベストプラクティス:pprintモジュール


pprintモジュールの基本的な使い方

import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

pprint.pprint(data)

このコードを実行すると、以下の出力が得られます。

{
    'age': 30,
    'friends': ['Hanako Sato', 'Jiro Tanaka'],
    'hobby': ['programming', 'reading'],
    'name': 'Taro Yamada'
}

pprintモジュールは、データ構造を再帰的に処理し、各要素をインデント付きで出力します。また、キーと値のペア、リスト、辞書などのデータ構造を適切にフォーマットします。

pprintモジュールの主な機能

  • 文字列への変換
    pformat()関数を使用して、データ構造を文字列に変換できます。
  • 改行の抑制
    compact引数をTrueに設定すると、改行を抑制して1行で出力を表示できます。
  • インデント幅の指定
    indent引数を使用して、インデントの幅を指定できます。
  • 出力要素の深さの指定
    depth引数を使用して、出力するデータ構造の深さを指定できます。
  • 出力幅の指定
    width引数を使用して、出力されるデータの最大幅を指定できます。

pprintモジュールの利点

  • コードの可読性を向上させる
  • デバッグに役立つ
  • 複雑なデータ構造を分かりやすく表示できる
  • pprintモジュールは、再帰的なデータ構造を処理するため、処理対象によっては時間がかかる場合があります。


例1:リストの出力

import pprint

data = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]

pprint.pprint(data)
[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

例2:辞書の出力

import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

pprint.pprint(data)
{
    'age': 30,
    'friends': ['Hanako Sato', 'Jiro Tanaka'],
    'hobby': ['programming', 'reading'],
    'name': 'Taro Yamada'
}

例3:ネストされたデータ構造の出力

import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": {
        "Hanako Sato": {"age": 25, "hobby": "music"},
        "Jiro Tanaka": {"age": 28, "hobby": "sports"},
    },
}

pprint.pprint(data)
{
    'age': 30,
    'friends': {
        'Hanako Sato': {'age': 25, 'hobby': 'music'},
        'Jiro Tanaka': {'age': 28, 'hobby': 'sports'},
    },
    'hobby': ['programming', 'reading'],
    'name': 'Taro Yamada'
}

例4:出力幅の指定

import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

pprint.pprint(data, width=40)
{'name': 'Taro Yamada',
 'age': 30,
 'hobby': ['programming', 'reading'],
 'friends': ['Hanako Sato', 'Jiro Tanaka']}

例5:出力要素の深さの指定

import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": {
        "Hanako Sato": {"age": 25, "hobby": "music"},
        "Jiro Tanaka": {"age": 28, "hobby": "sports"},
    },
}

pprint.pprint(data, depth=1)
{
    'name': 'Taro Yamada',
    'age': 30,
    'hobby': ['programming', 'reading'],
    'friends': {
        'Hanako Sato': {...},
        'Jiro Tanaka': {...}
    }
}

例6:インデント幅の指定

import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

pprint.pprint(data, indent=4)
{
    'age': 30,
        'friends': ['Hanako Sato', 'Jiro Tanaka'],
        'hobby': ['programming', 'reading'],
    'name': 'Taro Yamada'
}
import pprint

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}



jsonモジュール

  • 欠点:
    • 複雑なデータ構造を表現するのに適していない場合があります。
    • pprintモジュールほど詳細なフォーマットオプションを提供していません。
  • 利点:
    • JSON形式でデータを構造化できるので、他の言語やプログラムとのやり取りが容易になります。
    • 人間が読みやすい形式でデータを保存できます。
import json

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

json_data = json.dumps(data, indent=4)
print(json_data)

自定義のフォーマット関数

  • 欠点:
    • 開発と保守の手間がかかります。
    • pprintモジュールほど使いやすくありません。
  • 利点:
    • データを完全に制御できます。
    • 特定のニーズに合わせたフォーマットを作成できます。
def format_data(data, indent=0):
    if isinstance(data, dict):
        output = "{\n"
        for key, value in data.items():
            output += f"{indent * 4} {key}: {format_data(value, indent + 4)}\n"
        output += f"{indent * 2}}"
    elif isinstance(data, list):
        output = "[\n"
        for item in data:
            output += f"{indent * 4}{format_data(item, indent + 4)}\n"
        output += f"{indent * 2}]"
    else:
        output = str(data)
    return output

data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

print(format_data(data))

サードパーティ製ライブラリ

  • 欠点:
    • 導入と学習に時間がかかる場合があります。
    • プロジェクトで他のライブラリを使用する必要が生じる可能性があります。
  • 利点:
    • pprintモジュールよりも多くの機能を提供しているものがあります。
    • 特定のニーズに特化したライブラリを選択できます。

いくつかのサードパーティ製ライブラリの例:

単純な文字列連結

  • 欠点:
    • 複雑なデータ構造を表現するのに適していない場合があります。
    • 読みづらくなる可能性があります。
  • 利点:
    • 最もシンプルで軽量な方法です。
    • コードを明確に保つことができます。
data = {
    "name": "Taro Yamada",
    "age": 30,
    "hobby": ["programming", "reading"],
    "friends": ["Hanako Sato", "Jiro Tanaka"],
}

output = f"name: {data['name']}\n"
output += f"age: {data['age']}\n"
output += f"hobby: {data['hobby']}\n"
output += f"friends: {data['friends']}\n"

print(output)

pprintモジュールは、多くの場合においてデータ構造をフォーマット表示するのに最適なツールですが、状況によっては代替手段の方が適切な場合があります。上記で紹介した代替手段をそれぞれ検討し、ニーズに合ったものを選択してください。

  • [Pythonでデータ型を確認したい。 typeとpprintの違いは? - スタック・オーバーフロー [無効な