Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのpprintモジュール徹底解説:データ構造を美しく整形するプリティプリンター

pprintモジュールとは

pprintモジュール(lib/pprint.py)は、Pythonの標準ディストリビューションに同梱されている標準ライブラリの一部です。名前の「pprint」は「pretty printer(プリティプリンター)」の略で、その名の通りPythonのデータ構造を美しく見やすい形で出力するための機能を提供します。

Pythonインタープリタが正しく解析できる任意のデータ構造は、このモジュールによって整然とフォーマットされます。フォーマットされた式は可能な限り1行に収められますが、出力幅(widthパラメータ)を超える場合は自動的に複数行に折り返されます。pprint出力のユニークな特徴として、辞書型は表示前に自動的にキーでソートされるという点が挙げられます。

PrettyPrinterクラスのコンストラクタ

pprintモジュールにはPrettyPrinterクラスが定義されており、そのコンストラクタは以下の形式で呼び出します。

pprint.PrettyPrinter(indent, width, depth, stream, compact)

各パラメータの意味は次の通りです。

indent:再帰レベルごとに追加されるインデント量を指定します。デフォルト値は1です。

width:デフォルト値は80。出力幅はこの値に制限され、長さがwidthを超える場合は複数行に分割されます。

depth:出力する階層の深さ(レベル数)を制御します。

stream:デフォルトでは標準出力(stdout)。ファイルなど任意のストリームオブジェクトを指定することもできます。

compact:デフォルト値はFalse。Trueに設定すると、width内に収まるデータのみが出力されます。

PrettyPrinterクラスの主なメソッド

PrettyPrinterクラスには以下の2つの主要なメソッドが定義されています。

pprint():PrettyPrinterオブジェクトの整形済み表現を出力します。

pformat():コンストラクタのパラメータに基づいて整形したオブジェクトの文字列表現を返します。

基本的な使用例

次の例は、PrettyPrinterクラスのシンプルな使い方を示しています。

import pprint
students = {"Dilip":["English", "Maths", "Science"],
    "Raju":{"English":50,"Maths":60, "Science":70},
    "Kalpana":(50,60,70)}
pp = pprint.PrettyPrinter()
print ("normal print output")
print (students)
print ("----")
print ("pprint output")
pp.pprint(students)

実行結果では、通常のprint出力とpprintによる整形出力の違いを確認できます。辞書のキーがアルファベット順にソートされている点にも注目してください。

normal print output
{'Dilip': ['English', 'Maths', 'Science'], 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}, 'Kalpana': (50, 60, 70)}
----
pprint output
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}

便利関数:pprint()とpformat()

pprintモジュールには、PrettyPrinterクラスのメソッドに対応する便利関数としてpprint()とpformat()も定義されています。以下の例ではpprint()関数を使用しています。

from pprint import pprint
students = {"Dilip":["English", "Maths", "Science"],
"Raju":{"English":50,"Maths":60, "Science":70},
"Kalpana":(50,60,70)}
print ("normal print output")
print (students)
print ("----")
print ("pprint output")
pprint (students)

次の例では、pformat()メソッドとpformat()関数の両方を使っています。pformat()メソッドを使う場合は、まずPrettyPrinterオブジェクトを作成します。いずれの場合も、整形された文字列は通常のprint()関数で表示しています。

import pprint
students = {"Dilip":["English", "Maths", "Science"],
"Raju":{"English":50,"Maths":60, "Science":70},
"Kalpana":(50,60,70)}
print ("using pformat method")
pp = pprint.PrettyPrinter()
string = pp.pformat(students)
print (string)
print ('------')
print ("using pformat function")
string = pprint.pformat(students)
print (string)

上記コードの出力は以下の通りです。どちらの方法でも同じ整形結果が得られます。

using pformat method
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}
------
using pformat function
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}

カスタムクラスでの利用

プリティプリンターはカスタムクラスにも対応しています。クラス内で__repr__()メソッドをオーバーライドすることで、独自の整形出力を実現できます。

__repr__()メソッドはrepr()関数が呼ばれたときに実行され、Pythonオブジェクトの公式な文字列表現を返す役割を持ちます。print()関数にオブジェクトを渡すと、repr()関数の戻り値が出力されます。

次の例では、playerオブジェクトの文字列表現を__repr__()メソッドが返しています。

import pprint
class player:
def __init__(self, name, formats = [], runs = []):
self.name = name
self.formats = formats
self.runs = runs
def __repr__(self):
dct = {}
dct[self.name] = dict(zip(self.formats,self.runs))
return (repr(dct))
l1 = ['Tests','ODI','T20']
l2 = [[140, 45, 39],[15,122,36,67, 100, 49],[78,44, 12, 0, 23, 75]]
p1 = player("virat",l1,l2)
pp = pprint.PrettyPrinter()
pp.pprint(p1)

上記コードの出力は以下の通りです。

{'virat': {'Tests': [140, 45, 39], 'ODI': [15, 122, 36, 67, 100, 49], 'T20': [78, 44, 12, 0, 23, 75]}}

再帰的なデータ構造の扱い

再帰的なオブジェクトをpprintで出力しようとすると、最初の表現だけが表示され、以降の再帰部分には参照情報のみが出力されます。これにより無限ループを防いでいます。

>>> import pprint
>>> numbers = list(range(1,6))
>>> numbers.append(numbers)
>>> print (numbers)
[1, 2, 3, 4, 5, [...]]
>>> pprint.pprint(numbers)
[1, 2, 3, 4, 5, <Recursion on list with id=1403633698824>]

出力幅(width)の制限

widthパラメータをデフォルトの80から別の値に変更すると、構文を壊さないよう注意しながら複数行で整形して出力されます。

import pprint
students = {"Dilip":["English", "Maths", "Science"],
"Raju":{"English":50,"Maths":60, "Science":70},
"Kalpana":(50,60,70)}
pp=pprint.PrettyPrinter(width = 20)
pp.pprint(students)

このコードは記事冒頭の例とほぼ同じですが、PrettyPrinterオブジェクトの生成時にwidthパラメータを20に設定している点が異なります。そのため、pprintの出力はそれに応じて細かく改行されます。

{'Dilip': [ 'English',
   'Maths',
   'Science'],
'Kalpana': (50,
   60,
   70),
'Raju': {'English': 50,
   'Maths': 60,
   'Science': 70}}

まとめ

pprintモジュールを使うことで、ネストの深い辞書やリストなどのデータ構造を人間が読みやすい形で簡単に出力できます。デバッグ時やログ出力時に特に役立つ標準ライブラリなので、ぜひ活用してみてください。

  1. AlexaでHPプリンターに印刷する方法|音声操作プリントの設定手順を解説

    Hewlett-Packard(HP)は、ネットワーク接続対応プリンターに音声コントロール機能を追加しました。Alexa、Cortana、Google Homeを使用しているユーザーなら、パソコンを開かなくても、定番の書類や用紙を印刷できるようになっています。現時点では選択肢はやや限られていますが、フォーマット済みのドキュメントが必要になった場面では、このスキルがきっと役立つはずです。 必要なもの 音声コマンドで印刷する方法の一つが、AmazonのAlexaを使う方法です。この機能を利用するには、Alexa対応デバイス(Echo、Echo Dot、Echo Show、Echo Spotなど)

  2. ブラザープリンターが印刷できない!原因と8つの解決策を完全ガイド

    ブラザープリンターをお使いの方で、「突然印刷できなくなった」「プリンターが反応しない」といったトラブルに直面したことはありませんか?本記事では、ブラザープリンターが印刷できない問題の原因と、その具体的な解決策をステップ形式で詳しく解説します。他のプリンターと同様に、ブラザープリンターも機械である以上、小さな不具合が業務や家庭での作業に大きな支障をきたすことがあります。数あるトラブルの中でも「印刷が止まってしまう」という問題は、作業効率に直結するため、早急な対応が必要です。日頃から高品質な印刷サービスを提供してくれるブラザープリンターだからこそ、正しい対処法を知っておくことが大切です。ブラザープ