3.25 pprint -- データ出力の整然化

pprintモジュールを使うと、Pythonの任意のデータ構造をインタープ リタへの入力で使われる形式にして``pretty-print''できます。 フォーマット化された構造の中にPythonの基本的なタイプではないオブジェクト があるなら、表示できないかもしれません。 Pythonの定数として表現できない多くの組み込みオブジェクトと同様、ファイ ル、ソケット、クラスあるいはインスタンスのようなオブジェクトが含まれてい た場合は出力できません。

可能であればオブジェクトをフォーマット化して1行に出力しますが、与えられ た幅に合わないなら複数行に分けて出力します。 無理に幅を設定したいなら、PrettyPrinterオブジェクトを作成して明 示してください。

pprintモジュールには1つのクラスが定義されています:

クラス PrettyPrinter( ...)
PrettyPrinterインスタンスを作ります。 このコンストラクタにはいくつかのキーワードパラメータを設定できます。

streamキーワードで出力ストリームを設定できます;このストリームに対 して呼び出されるメソッドはファイルプロトコルのwrite()メソッドだ けです。 もし設定されなければ、PrettyPrintersys.stdoutを使用しま す。 さらに3つのパラメータで出力フォーマットをコントロールできます。 そのキーワードはindentdepthwidthです。

再帰的なレベルごとに加えるインデントの量はindentで設定できます;デ フォルト値は1です。 他の値にすると出力が少しおかしく見えますが、ネスト化されたところが見分け 易くなります。

出力されるレベルはdepthで設定できます; 出力されるデータ構造が深いなら、指定以上の深いレベルのものは"..."で 置き換えられて表示されます。 デフォルトでは、オブジェクトの深さを制限しません。

widthパラメータを使うと、出力する幅を望みの文字数に設定できます; デフォルトでは80文字です。 もし指定した幅にフォーマットできない場合は、できるだけ近づけます。

>>> import pprint, sys
>>> stuff = sys.path[:]
>>> stuff.insert(0, stuff[:])
>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(stuff)
[   [   '',
        '/usr/local/lib/python1.5',
        '/usr/local/lib/python1.5/test',
        '/usr/local/lib/python1.5/sunos5',
        '/usr/local/lib/python1.5/sharedmodules',
        '/usr/local/lib/python1.5/tkinter'],
    '',
    '/usr/local/lib/python1.5',
    '/usr/local/lib/python1.5/test',
    '/usr/local/lib/python1.5/sunos5',
    '/usr/local/lib/python1.5/sharedmodules',
    '/usr/local/lib/python1.5/tkinter']
>>>
>>> import parser
>>> tup = parser.ast2tuple(
...     parser.suite(open('pprint.py').read()))[1][1][1]
>>> pp = pprint.PrettyPrinter(depth=6)
>>> pp.pprint(tup)
(266, (267, (307, (287, (288, (...))))))

PrettyPrinterクラスにはいくつかの派生する関数が提供されていま す:

pformat( object[, indent[, width[, depth]]])
objectをフォーマット化して文字列として返します。 indentwidthと、depthPrettyPrinterコンス トラクタにフォーマット指定引数として渡されます。 バージョン 2.4 で 変更 された仕様: 引数 indentwidthと、depthが追加されました

pprint( object[, stream[, +indent[, width[, depth]]]])
objectをフォーマット化してstreamに出力し、最後に改行します。 streamが省略されたら、sys.stdoutに出力します。 これは対話型のインタープリタ上で、求める値をprintする代わりに 使用できます。 indentwidthと、depthPrettyPrinterコンス トラクタにフォーマット指定引数として渡されます。

>>> stuff = sys.path[:]
>>> stuff.insert(0, stuff)
>>> pprint.pprint(stuff)
[<Recursion on list with id=869440>,
 '',
 '/usr/local/lib/python1.5',
 '/usr/local/lib/python1.5/test',
 '/usr/local/lib/python1.5/sunos5',
 '/usr/local/lib/python1.5/sharedmodules',
 '/usr/local/lib/python1.5/tkinter']
バージョン 2.4 で 変更 された仕様: 引数 indentwidthと、depthが追加さ れました

isreadable( object)
objectをフォーマット化して出力できる(``readable'')か、あるいは eval()を使って値を再構成できるかを返しま す。 再帰的なオブジェクトに対しては常にfalseを返します。

>>> pprint.isreadable(stuff)
False

isrecursive( object)
objectが再帰的な表現かどうかを返します。

さらにもう1つ、関数が定義されています:

saferepr( object)
objectの文字列表現を、再帰的なデータ構造から保護した形式で返しま す。 もしobjectの文字列表現が再帰的な要素を持っているなら、再帰的な参照 は"<Recursion on typename with id=number>"で表示されま す。 出力は他と違ってフォーマット化されません。

>>> pprint.saferepr(stuff)
"[<Recursion on list with id=682968>, '', '/usr/local/lib/python1.5', '/usr/loca
l/lib/python1.5/test', '/usr/local/lib/python1.5/sunos5', '/usr/local/lib/python
1.5/sharedmodules', '/usr/local/lib/python1.5/tkinter']"



ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。