8.19。 repr - 代わりの repr() 実装
ソースコード: :source: `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 を渡します。 タイプ固有のメソッドは、 repr1()を呼び出して再帰的なフォーマットを実行し、
level - 1
を再帰的な呼び出しの level の値に使用する必要があります。
- 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>'