Quelle est la différence entre __str__
et __repr__
en Python ?
À moins que vous n'agissiez spécifiquement pour qu'il en soit autrement, la plupart des cours n'ont pas de résultats utiles pour l'un ou l'autre :
>>> class Sic(object): pass
...
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
Comme vous le voyez -- aucune différence, et aucune information au-delà de la classe et du id
de l'objet. Si vous ne surchargez qu'un seul des deux... :
>>> 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>
>>>
comme vous le voyez, si vous surchargez __repr__
, cela est AUSSI utilisé pour __str__
, mais pas vice versa.
Autres informations cruciales à connaître : __str__
sur un conteneur construit utilise le __repr__
, PAS le __str__
, pour les éléments qu'il contient. Et, malgré tout ce que l'on peut lire sur le sujet dans la documentation, personne ne se soucie de faire en sorte que la __repr__
des objets soit une chaîne de caractères que eval
peut utiliser pour construire un objet équivalent (c'est trop difficile, et ne pas savoir comment le module concerné a été importé rend la chose carrément impossible).
Donc, mon conseil : concentrez-vous à rendre __str__
raisonnablement lisible par l'homme, et __repr__
aussi peu ambiguë que possible, même si cela interfère avec le but vaguement inaccessible de rendre la valeur retournée par __repr__
acceptable comme entrée pour __eval__
!
__repr__
: représentation d'un objet python ; généralement, eval le reconvertira en cet objet.
__str__
: est ce que vous pensez être cet objet sous forme de texte
Par exemple
>>> 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
Tiré de [an (An Unofficial) Python Reference Wiki (archive copy)][1] par effbot :
__str__
"compute la représentation "informelle" en chaîne de caractères d'un objet. Cela diffère de __repr__
en ce qu'il n'est pas nécessaire que ce soit une expression Python valide : une représentation plus pratique ou plus concise peut être utilisée à la place."
[1] : https://web.archive.org/web/20071127054034/http://pyref.infogami.com/__str__