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)

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

8.19.1. Reprオブジェクト

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

Repr.maxlevel

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

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

指定されたオブジェクト型に対するエントリ表現の数についての制限。 maxdict に対するデフォルトは 4 で、 maxarray5 、その他に対しては 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 の型を使い、それを objlevel に渡します。再帰呼び出しにおいて level の値に対して level - 1 を与える再帰的な書式化を実行するために、型に固有のメソッドは repr1() を呼び出します。

Repr.repr_TYPE(obj, level)

型名に基づく名前をもつメソッドとして、特定の型に対する書式化メソッドは実装されます。メソッド名では、 TYPEstring.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>'