8.19. repr —代替repr()実装—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/repr
移動先:案内検索

8.19。 repr - 代わりの repr() 実装

ノート

repr モジュールは、Python3でreprlibに名前が変更されました。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。


ソースコード: :source: `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 の場合は4maxarray の場合は5、その他の場合は6です。

バージョン2.4の新機能: maxsetmaxfrozenset 、および 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)
特定の型のフォーマットメソッドは、型名に基づいた名前のメソッドとして実装されます。 メソッド名では、 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>'