8.19. "repr" --- もう一つの "repr()" の実装
*******************************************

注釈: "repr" モジュールは、Python 3 では "reprlib" にリネームされま
  した。 *2to3* ツールが自動的にソースコードの import を修正します。

**ソースコード:** Lib/repr.py

======================================================================

"repr" モジュールは結果の文字列の大きさを制限したオブジェクト表現を作
り出すための方法を提供します。これは Python デバッガで使われていますが
、他の状況でも同じように役に立つかもしれません。

このモジュールはクラスとインスタンス、それに関数を提供します:

class repr.Repr

   組み込みクラス  repr() によく似た関数を実装するために役に立つ書式化
   サービスを提供します。過度に長い表現を作り出さないように、異なるオ
   ブジェクト型に対する大きさの制限が追加されます。

repr.aRepr

   これは下で説明される "repr()" 関数を提供するために使われる "Repr"
   のインスタンスです。このオブジェクトの属性を変更すると、 "repr()"
   と Python デバッガが使うサイズ制限に影響します。

repr.repr(obj)

   これは "aRepr" の "repr()" メソッドです。同じ名前の組み込み関数が返
   す文字列と似ていますが、最大サイズに制限のある文字列を返します。


8.19.1. Reprオブジェクト
========================

"Repr" インスタンスは様々なオブジェクト型の表現にサイズ制限を与えるた
めに使えるいくつかの属性と、特定のオブジェクト型を書式化するメソッドを
提供します。

Repr.maxlevel

   再帰的な表現を作る場合の深さ制限。デフォルトは "6" です。

Repr.maxdict
Repr.maxlist
Repr.maxtuple
Repr.maxset
Repr.maxfrozenset
Repr.maxdeque
Repr.maxarray

   指定されたオブジェクト型に対するエントリ表現の数についての制限。
   "maxdict" に対するデフォルトは "4" で、 "maxarray" は "5" 、その他
   に対しては "6" です。

   バージョン 2.4 で追加: "maxset", "maxfrozenset", "set" の追加.

Repr.maxlong

   長整数の表現のおける文字数の最大値。中央の数字が抜け落ちます。デフ
   ォルトは "40" です。

Repr.maxstring

   文字列の表現における文字数の制限。文字列の"通常の"表現は文字の材料
   だということに注意してください: 表現にエスケープシーケンスが必要と
   される場合は、表現が短縮されたときにこれらはマングルされます。デフ
   ォルトは "30" です。

Repr.maxother

   この制限は "Repr" オブジェクトに利用できる特定の書式化メソッドがな
   いオブジェクト型のサイズをコントロールするために使われます。
   "maxstring" と同じようなやり方で適用されます。デフォルトは "20" で
   す。

Repr.repr(obj)

   インスタンスが強制する書式化を使う組み込み repr() と等価なもの。

Repr.repr1(obj, level)

   "repr()" が使う再帰的な実装。これはどの書式化メソッドを呼び出すかを
   決定するために *obj* の型を使い、それを *obj* と *level* に渡します
   。再帰呼び出しにおいて *level* の値に対して "level - 1" を与える再
   帰的な書式化を実行するために、型に固有のメソッドは "repr1()" を呼び
   出します。

Repr.repr_TYPE(obj, level)

   型名に基づく名前をもつメソッドとして、特定の型に対する書式化メソッ
   ドは実装されます。メソッド名では、 **TYPE** は
   "string.join(string.split(type(obj).__name__, '_'))" に置き換えられ
   ます。これらのメソッドへのディスパッチは "repr1()" によって処理され
   ます。再帰的に値の書式を整える必要がある型固有のメソッドは、
   "self.repr1(subobj, level - 1)" を呼び出します。


8.19.2. Reprオブジェクトをサブクラス化する
==========================================

更なる組み込みオブジェクト型へのサポートを追加するためや、すでにサポー
トされている型の扱いを変更するために、 "Repr.repr1()" による動的なディ
スパッチを使って "Repr" をサブクラス化することができます。この例はファ
イルオブジェクトのための特別なサポートを追加する方法を示しています:

   import repr as reprlib
   import sys

   class MyRepr(reprlib.Repr):
       def repr_file(self, obj, level):
           if obj.name in ['<stdin>', '<stdout>', '<stderr>']:
               return obj.name
           else:
               return repr(obj)

   aRepr = MyRepr()
   print aRepr.repr(sys.stdin)          # prints '<stdin>'
