Wat is het verschil tussen __str__
en __repr__
in Python?
Tenzij je specifiek iets anders doet, hebben de meeste klassen voor geen van beide nuttige resultaten:
>>> class Sic(object): pass
...
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
Zoals je ziet -- geen verschil, en geen info buiten de klasse en object's id
. Als je slechts één van de twee override..:
>>> 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>
>>>
zoals je ziet, als je __repr__
override, wordt dat'ALSJEBLIEFT gebruikt voor __str__
, maar niet andersom.
Andere cruciale weetjes: __str__
op een opgebouwde container gebruikt de __repr__
, NIET de __str__
, voor de items die hij bevat. En, ondanks de woorden over het onderwerp in typische docs, doet bijna niemand moeite om de __repr__
van objecten een string te laten zijn die eval
kan gebruiken om een gelijk object te bouwen (het is gewoon te moeilijk, EN niet weten hoe de betreffende module is geïmporteerd maakt het eigenlijk ronduit onmogelijk).
Dus, mijn advies: concentreer je op het redelijk menselijk leesbaar maken van __str__
, en __repr__
zo ondubbelzinnig mogelijk, zelfs als dat interfereert met het vage onbereikbare doel om __repr__
's geretourneerde waarde acceptabel te maken als invoer voor __eval__
!
__repr__
: representatie van python object gewoonlijk zal eval het terug converteren naar dat object
__str__
: is wat je denkt dat dat object in tekstvorm is
bijv.
>>> 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
Uit an (An Unofficial) Python Reference Wiki (archiefkopie) door effbot:
__str__
"berekent de "informele" string representatie van een object. Dit verschilt van __repr__
in die zin dat het geen geldige Python expressie hoeft te zijn: een meer handige of beknopte representatie mag in plaats daarvan worden gebruikt."