前回の記事がtextwrapだったので、文字列の見栄えを整えるつながりで今回はpprintを紹介しようと思います。
参考: pprint — データ出力の整然化 — Python 3.11.0b5 ドキュメント
自分はもっぱらdictやlistの表示に使うのですが、ドキュメントを見ると任意のデータ構造に使えるようなことが書いてありますね。
使い方は簡単で、printすると結果が少しちょっと見にくくなるようなdict等のデータを渡すだけです。値が少し長いデータを使ってprintと見比べてみます。
import pprint
# サンブルデータ作成
sample_data = {
1: "1つ目のキーの値",
2: "2つ目のキーの値",
3: "3つ目のキーの値",
4: "4つ目のキーの値",
5: "5つ目のキーの値",
6: "6つ目のキーの値",
7: "7つ目のキーの値",
}
# printした結果
print(sample_data)
"""
{1: '1つ目のキーの値', 2: '2つ目のキーの値', 3: '3つ目のキーの値', 4: '4つ目のキーの値', 5: '5つ目のキーの値', 6: '6つ目のキーの値', 7: '7つ目のキーの値'}
"""
# pprintした結果
pprint.pprint(sample_data)
"""
{1: '1つ目のキーの値',
2: '2つ目のキーの値',
3: '3つ目のキーの値',
4: '4つ目のキーの値',
5: '5つ目のキーの値',
6: '6つ目のキーの値',
7: '7つ目のキーの値'}
"""
pformat というメソッドもあって、こちらを使うと整形したものをprintするのではなく文字列として返してくれます。一応試しますが、文字列で戻ってきてるのをみないといけないので一旦変数に格納して通常のprintで出力します。
p_str = pprint.pformat(sample_data)
# 結果確認
print(p_str)
"""
{1: '1つ目のキーの値',
2: '2つ目のキーの値',
3: '3つ目のキーの値',
4: '4つ目のキーの値',
5: '5つ目のキーの値',
6: '6つ目のキーの値',
7: '7つ目のキーの値'}
"""
さて、このpprintですが、基本的にはそのまま使えば十分なのですが細かい調整ができるようにいろんな引数を取れます。
例えば、 indent= (デフォルト1)でインデントの文字数を指定できますし、width= (デフォルト80)で、横幅の文字数の最大値を指定できます。ただしwidthはベストエフォートでの指定なので、データによっては収めることできずにはみ出します。ちょっとwidthの指定によって結果が変わる例も見ておきましょう。さっきのdictはwidthが大きくても改行されたので、もう少しコンパクトなのを使います。
sample_data_mini = {
1: '1つ目のキーの値',
2: '2つ目のキーの値',
3: '3つ目のキーの値',
}
# 80文字に収まるので、width未指定だと1行で出力
pprint.pprint(sample_data_mini, indent=4)
"""
{1: '1つ目のキーの値', 2: '2つ目のキーの値', 3: '3つ目のキーの値'}
"""
# width が小さいと収まるように改行される。
pprint.pprint(sample_data_mini, indent=4, width=30)
"""
{ 1: '1つ目のキーの値',
2: '2つ目のキーの値',
3: '3つ目のキーの値'}
"""
また、データの構造によっては、辞書やリスト、タプルの入れ子になっていることもあると思います。そのようなとき、depthという引数を指定することにより何階層目まで出力するか指定することもできます。オーバーした分は省略記号… になります。ドキュメントのサンプルでちょっとやってみます。
tup = ('spam', ('eggs', ('lumberjack', ('knights',
('ni', ('dead', ('parrot', ('fresh fruit',))))))))
# depth未指定
pprint.pprint(tup, width=20)
"""
('spam',
('eggs',
('lumberjack',
('knights',
('ni',
('dead',
('parrot',
('fresh '
'fruit',))))))))
"""
# depth=3を指定
pprint.pprint(tup, width=20, depth=3)
"""
('spam',
('eggs',
('lumberjack',
(...))))
"""
何かAPIとか叩いて巨大なJSONが帰ってきたとき、中身を確認するのに先立って上の階層のkeyだけちょっと見たい、って場面で非常に便利です。
このほかにも、辞書の出力をするときにkeyでソートしてくれるsort_key= (デフォルトでTrue)や、widthの範囲に収まるならばできるだけ1行にまとめてくれるcompact= (デフォルトでTrue)などのオプションもあります。正直のこの二つはわざわざFalseを指定することはないかなと追うので結果は省略します。