Diferença entre __str__ e __repr__?

Qual é a diferença entre __str__ e __repr__ em Python?

A menos que você aja especificamente para garantir o contrário, a maioria das aulas não'não tem resultados úteis para nenhuma delas:

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

>>> print repr(Sic())

>>> 

Como você vê -- nenhuma diferença, e nenhuma informação além da classe e do objeto's id. Se você apenas sobrescrever uma das duas

>>> 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())

>>> 

como você vê, se você substituir __repr__, isso's TAMBÉM usado para __str__, mas não vice versa.

Outras informações cruciais a saber: __str__ em um recipiente embutido utiliza o __repr__, NÃO o __str__, para os itens que ele contém. E, apesar das palavras sobre o assunto encontradas em documentos típicos, quase ninguém incomoda fazendo a __repr__ de objetos ser uma string que eval pode usar para construir um objeto igual (it's apenas muito difícil, E não saber como o módulo relevante foi realmente importado torna-o realmente impossível).

Então, meu conselho: concentre-se em tornar __str__ razoavelmente legível para humanos, e __repr__ o mais inequívoco possível, mesmo que isso interfira com o objetivo difuso e inatingível de tornar __repr__'s valor retornado aceitável como entrada para __eval__!

Comentários (4)

__repr__: a representação do objeto python normalmente o eval irá convertê-lo de volta para aquele objeto

__str__: é o que você acha que é aquele objeto em forma de texto

por exemplo

>>> 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
Comentários (0)

De an (An Unofficial) Python Reference Wiki (cópia de arquivo) por effbot:

"computa o "informal" representação em cadeia de um objeto. Isto difere de __repr__ na medida em que não tem que ser uma expressão Python válida: uma representação mais conveniente ou concisa pode ser utilizada em seu lugar."

Comentários (1)