185 votes

Objectif de la méthode __repr__ ?

def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Quelle est la signification/le but de cette méthode ?

4 votes

4 votes

Pour les développeurs Java qui apprennent Python, la meilleure façon de voir cela est de considérer toString() en Java.

228voto

lazy1 Points 3691

__repr__ devrait retourner une représentation imprimable de l'objet, le plus probablement un des manières possibles de créer cet objet. Voir la documentation officielle aquí . __repr__ est plutôt destiné aux développeurs, tandis que __str__ est destiné aux utilisateurs finaux.

Un exemple simple :

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2 votes

Paresseux1 : Je voulais principalement corriger le formatage (il est utile d'avoir des exemples qui correspondent le plus possible à ce qu'ils verront dans une session d'exemple), mais j'ai également modifié le format de sortie pour qu'il soit explicitement différent de l'affectation, car cela améliore grandement la clarté pour quelqu'un qui serait confus à ce sujet, imho. (Si je suis allé trop loin, il suffit de rééditer, et je vous devrai une bière).

2 votes

1 votes

Il faudrait peut-être utiliser %r au lieu de %s : stackoverflow.com/questions/6005159/

23voto

dmazzoni Points 6586

Ceci est très bien expliqué dans le Documentation Python :

répression ( objet ) : Renvoie une chaîne de caractères contenant la représentation imprimable d'un objet. C'est la même valeur que celle obtenue par les conversions (guillemets inversés). Il est parfois utile de pouvoir accéder à cette opération comme une fonction ordinaire. Pour de nombreux types, cette fonction tente de retourner une chaîne de caractères qui donnerait un objet de même valeur lorsqu'elle est passée à la fonction eval() sinon, la représentation est une chaîne de caractères entre crochets qui contient le nom du type de l'objet ainsi que des informations supplémentaires, dont souvent le nom et l'adresse de l'objet. Une classe peut contrôler ce que cette fonction renvoie pour ses instances en définissant une fonction __repr__() méthode.

Donc ce que vous voyez ici est l'implémentation par défaut de __repr__ qui est utile pour la sérialisation et le débogage.

6 votes

Je pense que la méthode des guillemets inversés (ou 'backticks') pour obtenir la "représentation" d'un objet est dépréciée, et a été supprimée pour la version 3.0.

0 votes

MatrixFrog : les deux sont vrais, mais la documentation actuelle de la 2.x le dit toujours, d'où la citation.

0 votes

Pour de nombreux objets, __repr__ et __str__ sont la même fonction. En fait, si vous définissez uniquement __str__, alors __repr__ appelle par défaut __str__. Le cas le plus évident où cela n'est pas vrai est celui des chaînes de caractères elles-mêmes : str('stackoverflow') retourne stackoverflow mais repr('stackoverflow') est 'stackoverflow' .

19voto

__repr__ est utilisé par l'interpréteur Python autonome pour afficher une classe au format imprimable. Exemple :

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

Dans les cas où un __str__ n'est pas définie dans la classe, elle appellera la méthode __repr__ dans le but de créer une représentation imprimable.

>>> str(demo)
'<StackOverflow demo object __repr__>'

En outre, print() la classe appellera __str__ par défaut.


Documentation si vous voulez bien

6voto

Jasper Kinoti Points 369

El Je ne sais pas. indique simplement à Python comment imprimer les objets de la classe

2voto

Anh-Thi DINH Points 155

Un exemple pour voir les différences entre eux (j'ai copié de cette source ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

Les retours de repr() y str() sont identiques pour int x mais il y a une différence entre les valeurs de retour de l'option str y -- l'un est officiel et l'autre est informel . L'une des différences les plus importantes entre les représentations formelles et informelles est que l'implémentation par défaut de la fonction __repr__ pour une valeur str peut être appelée comme argument de eval, et la valeur de retour sera un objet string valide, comme ceci :

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Si vous essayez d'appeler la valeur de retour de __str__ comme argument à eval, le résultat ne sera pas valide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X