¿Cuál es la diferencia entre __str__
y __repr__
en Python?
A menos que se actúe específicamente para asegurar lo contrario, la mayoría de las clases no tienen resultados útiles para ninguno de los dos:
>>> class Sic(object): pass
...
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
Como ves... no hay diferencia, y no hay información más allá del id
de la clase y del objeto. Si sólo anulas uno de los dos..:
>>> 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>
>>>
como ves, si sobrescribes __repr__
, eso también se usa para __str__
, pero no al revés.
Otros detalles cruciales que hay que saber: __str__
en un contenedor incorporado utiliza el __repr__
, NO el __str__
, para los elementos que contiene. Y, a pesar de las palabras sobre el tema que se encuentran en los documentos típicos, casi nadie se molesta en hacer que el __repr__
de los objetos sea una cadena que eval
pueda usar para construir un objeto igual (es demasiado difícil, y no saber cómo se importó el módulo relevante lo hace realmente imposible).
Así que, mi consejo: céntrate en hacer que __str__
sea razonablemente legible para los humanos, y que __repr__
sea tan inequívoco como puedas, incluso si eso interfiere con el difuso e inalcanzable objetivo de hacer que el valor devuelto por __repr__
sea aceptable como entrada para __eval__
.
__repr__
: representación de un objeto python, normalmente eval lo convertirá a ese objeto
__str__
: es lo que crees que es ese objeto en forma de texto
Por ejemplo
>>> 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
De an (An Unofficial) Python Reference Wiki (archive copy) por effbot:
__str__
"calcula la representación de cadena "informal" de un objeto. Esto difiere de __repr__
en que no tiene que ser una expresión válida de Python: una representación más conveniente o concisa puede ser usada en su lugar."