Objectif de __repr__ de Python

139
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?

zjm1126
la source
@ zjm1126: voulez-vous savoir pourquoi >>> variableimprime ce qui __repr__()retourne?
Esteban Küber
19
Cette documentation endort les gens. De plus, il est utile d'apprendre des autres comment cela est utilisé.
Concerned_Citizen
Double
Vlad Bezden
2
Pour les développeurs Java qui apprennent Python, la meilleure façon de voir cela est d'utiliser toString () en Java.
Ravi

Réponses:

189

__repr__doit renvoyer une représentation imprimable de l'objet, probablement l' une des manières possibles de créer cet objet. Voir la documentation officielle ici . __repr__est plus pour les développeurs que __str__pour les 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)
paresseux1
la source
2
lazy1: Je voulais principalement corriger le formatage (il est utile que les exemples 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 confus à ce sujet, à mon humble avis. (Si je suis allé trop loin, rééditez simplement et je vous dois une bière.)
1
Cela devrait peut-être utiliser% r au lieu de% s: stackoverflow.com/questions/6005159/…
Jonathan Adelson
43
Ce n'est pas vraiment correct. __str__est la sortie qui est censée être lisible par l'homme: __repr__est censée être une représentation lisible par l'interpréteur Python (c'est-à-dire que fournir la chaîne à l'interpréteur devrait recréer l'objet). Si un objet n'a pas de __str__méthode, cependant, __repr__est utilisé à la place. Aussi comme noté: cet exemple imprime en fait la __str__méthode de self.xet self.y: %rdevrait être utilisé à la place de %sl'opération de formatage de chaîne (puisque la classe ne définit pas __str__, __repr__est en fait retournée de toute façon, mais c'est une anomalie).
Daniel Andersson
20

Ceci est assez bien expliqué dans la documentation Python :

repr ( object ): renvoie une chaîne contenant une représentation imprimable d'un objet. C'est la même valeur produite 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 renvoyer une chaîne qui donnerait un objet avec la même valeur lorsqu'elle est passée à eval(), sinon la représentation est une chaîne entre crochets qui contient le nom du type de l'objet avec des informations supplémentaires comprenant 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 __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.

dmazzoni
la source
5
Je pense que la méthode des guillemets inversés (ou 'backticks') pour obtenir la "représentation" d'un objet est obsolète et a été supprimée pour la version 3.0
MatrixFrog
MatrixFrog: les deux sont vrais, mais la documentation 2.x actuelle le dit toujours, d'où vient la citation.
Pour de nombreux objets, __repr__ et __str__ ont la même fonction. En fait, si vous ne définissez que __str__, __repr__ par défaut n'appelle que __str__. Le cas le plus évident où ce n'est pas vrai est celui des chaînes elles-mêmes: str ('stackoverflow') renvoie stackoverflowmais repr ('stackoverflow') l'est 'stackoverflow'.
MatrixFrog
6
Vous avez cela à l'envers, __repr__ n'utilise jamais __str__, mais l'inverse peut se produire. Voir docs.python.org/reference
13

__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ù une __str__méthode n'est pas définie dans la classe, elle appellera la __repr__fonction pour tenter de créer une représentation imprimable.

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

De plus, print()la classe appellera __str__par défaut.


Documentation , s'il vous plaît


la source
7

La méthode __repr__ indique simplement à Python comment imprimer les objets d'une classe

Jasper Kinoti
la source
1

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

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

Les retours de repr()et str()sont identiques pour int x, mais il y a une différence entre les valeurs de retour pour str y- l'un est formel 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 __repr__pour une valeur str peut être appelée en tant qu'argument pour eval, et la valeur de retour serait un objet chaîne 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.

Anh-Thi DINH
la source
1

Lorsque nous créons de nouveaux types en définissant des classes, nous pouvons profiter de certaines fonctionnalités de Python pour rendre les nouvelles classes pratiques à utiliser. L'une de ces caractéristiques est les «méthodes spéciales», également appelées «méthodes magiques».

Les méthodes spéciales ont des noms qui commencent et se terminent par deux traits de soulignement. Nous les définissons, mais nous ne les appelons généralement pas directement par leur nom. Au lieu de cela, ils s'exécutent automatiquement dans des circonstances spécifiques.

Il est pratique de pouvoir afficher la valeur d'une instance d'un objet à l'aide d'une instruction d'impression. Lorsque nous faisons cela, nous aimerions que la valeur soit représentée dans la sortie dans un format compréhensible et non ambigu. La méthode spéciale repr peut être utilisée pour faire en sorte que cela se produise. Si nous définissons cette méthode, elle peut être appelée automatiquement lorsque nous imprimons la valeur d'une instance d'une classe pour laquelle nous avons défini cette méthode. Il faut cependant mentionner qu'il existe également une méthode spéciale str , utilisée dans un but similaire, mais pas identique, qui peut avoir la priorité, si nous l'avons également définie.

Si nous n'avons pas défini, la méthode repr pour la classe Point3D, et avons instancié my_point en tant qu'instance de Point3D, puis nous faisons ceci ...

print my_point ... nous pouvons voir cela comme la sortie ...

Pas très gentil, hein?

Donc, nous définissons la méthode spéciale repr ou str , ou les deux, pour obtenir un meilleur résultat.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

Production ...

(1, 2, 3) (1, 2, 3)

Ashish Anand
la source