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

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

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

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

class `PrettyPrinter`( | ...)

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

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

  再帰的なレベルごとに加えるインデントの量は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])

  objectをフォーマット化してstreamに出力し、最後に改行します。 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)
      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']"