Qual è la differenza tra __str__
e __repr__
in Python?
A meno che non si agisca specificamente per garantire il contrario, la maggior parte delle classi non ha risultati utili per nessuno dei due:
>>> class Sic(object): pass
...
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
Come vedi -- nessuna differenza, e nessuna informazione al di là della classe e dell'oggetto id
. Se si sovrascrive solo uno dei due...:
>>> 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>
>>>
come vedete, se sovrascrivete __repr__
, questo viene anche usato per __str__
, ma non viceversa.
Altre chicche cruciali da sapere: __str__
su un contenitore costruito usa la __repr__
, NON la __str__
, per gli elementi che contiene. E, nonostante le parole sull'argomento che si trovano nei documenti tipici, quasi nessuno si preoccupa di rendere la __repr__
degli oggetti una stringa che eval
può usare per costruire un oggetto uguale (è troppo difficile, e non sapere come è stato importato il modulo in questione lo rende di fatto impossibile).
Quindi, il mio consiglio: concentratevi sul rendere __str__
ragionevolmente leggibile all'uomo, e __repr__
il meno ambiguo possibile, anche se questo interferisce con l'obiettivo irraggiungibile di rendere il valore restituito di __repr__
accettabile come input per __eval__
!
__repr__
: rappresentazione di un oggetto python di solito eval lo riconverte in quell'oggetto
__str__
: è qualsiasi cosa pensiate sia quell'oggetto in forma di testo
es.
>>> 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
Da an (An Unofficial) Python Reference Wiki (archive copy) di effbot:
__str__
"computa la "rappresentazione informale" della stringa di un oggetto. Questo differisce da __repr__
in quanto non deve essere un'espressione Python valida: una rappresentazione più conveniente o concisa può essere usata al suo posto."