Pythonの__str__
と__repr__
の違いは何ですか?
あなたが特別な行動を取らない限り、ほとんどのクラスはどちらにも役立つ結果を得られません。
>>> class Sic(object): pass
...
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
ご覧のように -- 違いはなく、クラスとオブジェクトの id
を超える情報もありません。 どちらか一方だけをオーバーライドする場合は......。
>>> class Sic(object):
... def __repr__(object): return 'foo'
...
>>> print str(Sic())
foo
>>> print repr(Sic())
foo
>>> class Sic(object):
... def __str__(object): return 'foo'
...
>>> print str(Sic())
foo
>>> print repr(Sic())
<__main__.Sic object at 0x2617f0>
>>>
ご覧のように、__repr__
をオーバーライドすると、それは __str__
にも使われますが、その逆はありません。
他にも知っておくべき重要なことがあります: ビルドオンコンテナの __str__
は、含まれるアイテムに対して __str__
ではなく __repr__
を使用します。また、一般的なドキュメントにはこのようなことが書かれていますが、オブジェクトの __repr__
を eval
が同等のオブジェクトを構築するために使用できる文字列にしようとする人はほとんどいません(難しすぎるし、関連するモジュールが実際にどのようにインポートされたかわからないので、実際には不可能です)。
アドバイスとしては、__str__
を適度に人間が読めるようにし、__repr__
を可能な限り曖昧さのないものにすることに集中してください。それが、__repr__
の戻り値を __eval__
の入力として受け入れられるようにするという曖昧で達成不可能な目標を妨げることになってもです
__repr__
: pythonオブジェクトの表現、通常evalはそのオブジェクトに変換します。
str`: そのオブジェクトと思われるものをテキスト形式で表したもの。
例えば、以下のようになります。
>>> s="""w'o"w"""
>>> repr(s)
'\'w\\\'o"w\''
>>> str(s)
'w\'o"w'
>>> eval(str(s))==s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
w'o"w
^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
from an (An Unofficial) Python Reference Wiki (archive copy) by effbot:
__str__
"*オブジェクトの "非公式な "文字列表現を計算します。これは __repr__
とは異なり、有効な Python 式である必要はありません: より便利で簡潔な表現を代わりに使用することができます。