str__と__repr__の違いは?

Pythonの__str____repr__の違いは何ですか?

あなたが特別な行動を取らない限り、ほとんどのクラスはどちらにも役立つ結果を得られません。

>>> class Sic(object): pass
... 
>>> print str(Sic())

>>> print repr(Sic())

>>> 

ご覧のように -- 違いはなく、クラスとオブジェクトの 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())

>>> 

ご覧のように、__repr__ をオーバーライドすると、それは __str__ にも使われますが、その逆はありません。

他にも知っておくべき重要なことがあります: ビルドオンコンテナの __str__ は、含まれるアイテムに対して __str__ ではなく __repr__ を使用します。また、一般的なドキュメントにはこのようなことが書かれていますが、オブジェクトの __repr__eval が同等のオブジェクトを構築するために使用できる文字列にしようとする人はほとんどいません(難しすぎるし、関連するモジュールが実際にどのようにインポートされたかわからないので、実際には不可能です)。

アドバイスとしては、__str__ を適度に人間が読めるようにし、__repr__ を可能な限り曖昧さのないものにすることに集中してください。それが、__repr__ の戻り値を __eval__ の入力として受け入れられるようにするという曖昧で達成不可能な目標を妨げることになってもです

解説 (4)

__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 "", line 1, in 
  File "", line 1
    w'o"w
       ^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
解説 (0)

from an (An Unofficial) Python Reference Wiki (archive copy) by effbot:

__str__ "*オブジェクトの "非公式な "文字列表現を計算します。これは __repr__ とは異なり、有効な Python 式である必要はありません: より便利で簡潔な表現を代わりに使用することができます。

解説 (1)