Différence entre __str__ et __repr__ ?

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

>>> print repr(Sic())

>>> 

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

>>> 

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__ !

Commentaires (4)

__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 "", line 1, in 
  File "", line 1
    w'o"w
       ^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
Commentaires (0)

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__

Commentaires (1)