Python pprintで表示をカスタマイズ

Python学習【365日チャレンジ!】295日目のマスターU(@Udemy11)です。

釣りあるあるなんですが、気合いを入れてちょっと早めに準備バッチリで釣りに行くと釣れないことが多くて、慌ててなにか忘れ物をしたときに限ってよく釣れるんです。

昨晩もアオリイカとアジを釣るぞ~と気合い入れて準備万端で出かけていったのですが、結果は見事なまでの丸坊主。。。

ま~釣れなければ、魚をさばく必要もないし、フィッシュグリップやクーラーを洗う必要がないので、面倒じゃなくていいのですが、やっぱり釣りに行ったら釣りたいですよね。

近いうちにリベンジにいこうと思います。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、formatとクラスオブジェクトを使ってreprの動作をチェックしました。

クラスを作れば、デフォルトで__repr____str__が用意されているので、それらの値をオーバーライドすることができましたが、通常は__repr__を書き換えることはありません。

クラスの__init__で引数を定義して、あとからformatを使って引数を活用することもできました。

詳細については昨日の記事をごらんください。

今日は、出力フォーマットをカスタマイズできるpprintを学習します。

pprint.PrettyPrinter

かんたんなリストを定義して、より見ずらいリストにしてからpprintを使って見やすく表示してみます。

import pprint

l = ['apple', 'banana', 'mango', 'orange', 'peach']
l.insert(0, l[:])
print(l)

pp = pprint.PrettyPrinter()
pp.pprint(l)

出力結果

[['apple', 'banana', 'mango', 'orange', 'peach'], 'apple', 'banana', 'mango', 'orange', 'peach']
[['apple', 'banana', 'mango', 'orange', 'peach'],
 'apple',
 'banana',
 'mango',
 'orange',
 'peach']

3行目で果物のリストを作って、さらにそのリストのインデックス0の位置に同じリストを挿入したリストにして、5行目でリストを出力しています。

7行目でPrettyPrinterオブジェクトを作って、オブジェクトにリストlを入れてpprint出力しています。

printでは、リストが1行で出力されていますが、pprintだとリストの値が一つづつ開業されて出力されます。

indent・width・compact・depth

PrettyPrinterには、見やすい表示にするための引数が用意されています。

indent

pp = pprint.PrettyPrinter(indent=3)
pp.pprint(l)

出力結果

[  ['apple', 'banana', 'mango', 'orange', 'peach'],
   'apple',
   'banana',
   'mango',
   'orange',
   'peach']

出力結果はprint出力の部分を省いていますが、indent=3を指定したことで行頭にインデントが挿入されています。

width

pp = pprint.PrettyPrinter(width=30)
pp.pprint(l)

出力結果

[['apple',
  'banana',
  'mango',
  'orange',
  'peach'],
 'apple',
 'banana',
 'mango',
 'orange',
 'peach']

widthで1行が30文字を超えるものは、自動的に改行したリストにするので、先頭のリストが一つの値ごとに改行されて出力されています。

compact=True

pp = pprint.PrettyPrinter(width=30, compact=True)
pp.pprint(l)

出力結果

[['apple', 'banana', 'mango',
  'orange', 'peach'],
 'apple', 'banana', 'mango',
 'orange', 'peach']

compact=Trueを入れると、条件に合わせて見やすい出力で表示してくれます。

depth

import pprint

l = ['apple', 'banana', 'mango', 'orange', 'peach']
l.insert(0, l[:])
l.insert(0, l[:])
l.insert(0, l[:])
l.insert(0, l[:])

pp = pprint.PrettyPrinter(depth=2)
pp.pprint(l)

出力結果

[[[...], [...], [...], 'apple', 'banana', 'mango', 'orange', 'peach'],
 [[...], [...], 'apple', 'banana', 'mango', 'orange', 'peach'],
 [[...], 'apple', 'banana', 'mango', 'orange', 'peach'],
 ['apple', 'banana', 'mango', 'orange', 'peach'],
 'apple',
 'banana',
 'mango',
 'orange',
 'peach']

最初のリストに4回同じリストを挿入して、depthを使って出力しています。

depthは、階層の深さを指定して、表示を...にして省略してくれます。

例示したのは、リストですが、タプルでも辞書型でもPrettyPrinterで同じように出力の表示をカスタマイズすることが可能です。

まとめ

出力結果の表示をカスタマイズすれば、私たち人間にもわかりやすくなります。

コンピューターが読み込むだけなら見やすい表示に変える必要はなく、規則に沿った形でデータが格納されていれば、規則に従って読み込むことができるので、pprintは、コンピューターのためではなく、人のために存在するメソッドだと言えます。

print自体も人のためのメソッドなんですけどね。

人とコンピューターをつなげるプログラミング言語は、ほんといろいろと人間に対して気を使わないといけないので大変ですよね(笑)。

今日はこのへんで。

ということで、明日もGood Python!