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

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

reprlib —代替の repr()実装

ソースコード: :source: `Lib / reprlib.py`



reprlib モジュールは、結果の文字列のサイズに制限のあるオブジェクト表現を生成する手段を提供します。 これはPythonデバッガーで使用され、他のコンテキストでも役立つ場合があります。

このモジュールは、クラス、インスタンス、および関数を提供します。

class reprlib.Repr
組み込みの repr()と同様の関数の実装に役立つフォーマットサービスを提供するクラス。 過度に長い表現の生成を回避するために、さまざまなオブジェクトタイプのサイズ制限が追加されています。
reprlib.aRepr
これは、以下で説明する repr()関数を提供するために使用される Repr のインスタンスです。 このオブジェクトの属性を変更すると、 repr()およびPythonデバッガーで使用されるサイズ制限に影響します。
reprlib.repr(obj)
これは、aReprrepr()メソッドです。 同じ名前の組み込み関数によって返される文字列と同様の文字列を返しますが、ほとんどのサイズに制限があります。

このモジュールは、サイズ制限ツールに加えて、__repr__()への再帰呼び出しを検出し、代わりにプレースホルダー文字列を置き換えるためのデコレーターも提供します。

@reprlib.recursive_repr(fillvalue='...')

同じスレッド内の再帰呼び出しを検出するための__repr__()メソッドのデコレータ。 再帰呼び出しが行われると、 fillvalue が返されます。それ以外の場合は、通常の__repr__()呼び出しが行われます。 例えば:

>>> from reprlib import recursive_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の新機能。

Reprオブジェクト

Repr インスタンスは、さまざまなオブジェクトタイプの表現のサイズ制限を提供するために使用できるいくつかの属性、および特定のオブジェクトタイプをフォーマットするメソッドを提供します。

Repr.maxlevel
再帰的表現の作成に関する深さの制限。 デフォルトは6です。
Repr.maxdict

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

指定されたオブジェクトタイプに対して表されるエントリの数の制限。 デフォルトは、 maxdict の場合は4maxarray の場合は5、その他の場合は6です。
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'_'.join(type(obj).__name__.split())に置き換えられています。 これらのメソッドへのディスパッチは、 repr1()によって処理されます。 値を再帰的にフォーマットする必要があるタイプ固有のメソッドは、self.repr1(subobj, level - 1)を呼び出す必要があります。


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>'