8.12. reprlib — もう一つの repr() の実装¶
ソースコード: Lib/reprlib.py
reprlib モジュールは、結果として生じる文字列のサイズに対する制限付きでオブジェクト表現を生成するための手段を提供します。これは Python デバッガの中で使用されており、他の文脈でも同様に役に立つかもしれません。
このモジュールはクラスとインスタンス、それに関数を提供します:
-
class
reprlib.Repr¶ 組み込みクラス
repr()によく似た関数を実装するために役に立つ書式化サービスを提供します。過度に長い表現を作り出さないように、異なるオブジェクト型に対する大きさの制限が追加されます。
-
reprlib.aRepr¶ これは下で説明される
repr()関数を提供するために使われるReprのインスタンスです。このオブジェクトの属性を変更すると、repr()と Python デバッガが使うサイズ制限に影響します。
サイズを制限するツールに加えて、このモジュールはさらに 、 __repr__() に対する再帰呼び出しの検出とプレースホルダー文字列による置換のためのデコレータを提供します。
-
@reprlib.recursive_repr(fillvalue="...")¶ __repr__()メソッドに対する同一スレッド内の再帰呼び出しを検出するデコレータです。再帰呼び出しが行われている場合 fillvalue が返されます。そうでなければ通常の__repr__()呼び出しが行われます。例えば:>>> class MyList(list): ... @recursive_repr() ... def __repr__(self): ... return '<' + '|'.join(map(repr, self)) + '>' ... >>> m = MyList('abc') >>> m.append(m) >>> m.append('x') >>> print(m) <'a'|'b'|'c'|...|'x'>
バージョン 3.2 で追加.
8.12.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です。
-
Repr.maxlong¶ 整数の表現のおける文字数の最大値。中央の数字が抜け落ちます。デフォルトは
40です。
-
Repr.maxstring¶ 文字列の表現における文字数の制限。文字列の”通常の”表現は文字の「元」として使われることに注意してください。表現にエスケープシーケンスが必要とされる場合、表現が短縮されるときにこれらのエスケープシーケンスの形式は崩れます。デフォルトは
30です。
-
Repr.maxother¶ この制限は
Reprオブジェクトに利用できる特定の書式化メソッドがないオブジェクト型のサイズをコントロールするために使われます。maxstringと同じようなやり方で適用されます。デフォルトは20です。
-
Repr.repr1(obj, level)¶ repr()が使う再帰的な実装。これはどの書式化メソッドを呼び出すかを決定するために obj の型を使い、それを obj と level に渡します。再帰呼び出しにおいて level の値に対してlevel - 1を与える再帰的な書式化を実行するために、型に固有のメソッドはrepr1()を呼び出します。
-
Repr.repr_TYPE(obj, level) 型名に基づく名前をもつメソッドとして、特定の型に対する書式化メソッドは実装されます。メソッド名では、 TYPE は
'_'.join(type(obj).__name__.split())に置き換えられます。これらのメソッドへのディスパッチはrepr1()によって処理されます。再帰的に値の書式を整える必要がある型固有のメソッドは、self.repr1(subobj, level - 1)を呼び出します。
8.12.2. Reprオブジェクトをサブクラス化する¶
更なる組み込みオブジェクト型へのサポートを追加するためや、すでにサポートされている型の扱いを変更するために、 Repr.repr1() による動的なディスパッチを使って Repr をサブクラス化することができます。この例はファイルオブジェクトのための特別なサポートを追加する方法を示しています:
import reprlib
import sys
class MyRepr(reprlib.Repr):
def repr_TextIOWrapper(self, obj, level):
if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
return obj.name
return repr(obj)
aRepr = MyRepr()
print(aRepr.repr(sys.stdin)) # prints '<stdin>'
