3.19 標準モジュール pprint

 

pprintモジュールは、インタープリタの入力として使用することができる形の、任意のデータ構造を``pretty-print''できます。フォーマットされたデータ構造が、基本的なパイソンのタイプではないオブジェクトを含む場合、表現は読み込むことができないかもしれません。Python定数として表すことができない他の組み込みオブジェクトはもちろん、ファイル、ソケット、クラス、インスタンスようなオブジェクトが含まれていた場合は、そのようになります。

フォーマット表現は、可能ならばオブジェクトを1行に納めようとします。与えられた幅に納まらない場合は、複数行に分けます。幅の制限に合わせる必要がある場合は、(explicitly:はっきりと、明白に)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)
objectのフォーマット表現を、文字列として返します。フォーマットのデフォルトパラメーターが使用されます。

pprint (object[, stream])
streamobjectのフォーマット表現を、改行に続いて出力します。streamが省略されると、sys.stdoutが使われます。対話型インタプリタで、値を調べるのにprint文の代わりに使われるかもしれません。フォーマットのデフォルトパラメーターが使用されます。

>>> 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']

isreadable (object)
objectのフォーマット表現が``readable''かどうか、またはeval() を使う値が再現できるかどうかを決定します。 この関数は、再帰的なオブジェクトはいつもfalseを返します。

>>> pprint.isreadable(stuff)
0

isrecursive (object)
objectが、再帰的な表現が必要かどうか決定します。

次の関数も定義されています。

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']"


guido@python.org