Zweck von Pythons __repr__

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

Welche Bedeutung / welchen Zweck hat diese Methode?

zjm1126
quelle
@ zjm1126: Möchten Sie wissen, warum >>> variableprint was __repr__()zurückgibt?
Esteban Küber
18
Diese Dokumentation versetzt die Menschen in den Schlaf. Außerdem ist es hilfreich, von anderen zu lernen, wie dies verwendet wird.
Concerned_Citizen
Mögliches Duplikat des Unterschieds zwischen __str__ und __repr__ in Python
Vlad Bezden
2
Für Java-Entwickler, die Python lernen, ist toString () in Java der beste Weg, dies zu betrachten.
Ravi

Antworten:

187

__repr__sollte eine druckbare Darstellung des Objekts zurückgeben, höchstwahrscheinlich eine der Möglichkeiten, dieses Objekt zu erstellen. Siehe offizielle Dokumentation hier . __repr__ist mehr für Entwickler, während __str__es für Endbenutzer ist.

Ein einfaches Beispiel:

>>> 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)
faul1
quelle
2
lazy1: Ich wollte in erster Linie die Formatierung korrigieren (es ist nützlich, wenn Beispiele so genau wie möglich mit dem übereinstimmen, was sie in einer Beispielsitzung sehen), aber ich habe auch das Ausgabeformat so angepasst, dass es sich explizit von der Zuweisung unterscheidet verbessert die Klarheit für jemanden, der darüber verwirrt ist, erheblich, imho. (Wenn ich zu weit gegangen bin, bearbeiten Sie es einfach erneut, und ich schulde Ihnen ein Bier.)
2
Die Referenz wurde weggelassen
S.Lott
1
Dies sollte vielleicht% r anstelle von% s verwenden: stackoverflow.com/questions/6005159/…
Jonathan Adelson
43
Das ist nicht wirklich richtig. __str__ist die Ausgabe, die für Menschen lesbar sein soll: __repr__soll eine für den Python-Interpreter lesbare Darstellung sein (dh das Zuführen der Zeichenfolge zum Interpreter sollte das Objekt neu erstellen). Wenn ein Objekt jedoch keine __str__Methode hat, __repr__wird stattdessen verwendet. Ebenfalls wie erwähnt: In diesem Beispiel wird tatsächlich die __str__Methode von self.xund self.y: gedruckt, die %ranstelle der %sFormatierungsoperation für Zeichenfolgen verwendet werden sollte (da die Klasse nicht definiert __str__, __repr__wird sie tatsächlich zurückgegeben, es handelt sich jedoch um eine Anomalie).
Daniel Andersson
20

Dies wird in der Python-Dokumentation recht gut erklärt :

repr ( Objekt ): Gibt eine Zeichenfolge zurück, die eine druckbare Darstellung eines Objekts enthält. Dies ist der gleiche Wert, der durch Conversions (umgekehrte Anführungszeichen) erzielt wird. Es ist manchmal nützlich, als normale Funktion auf diesen Vorgang zugreifen zu können. Bei vielen Typen versucht diese Funktion, eine Zeichenfolge zurückzugeben, die bei Übergabe ein Objekt mit demselben Wert ergibt eval(). Andernfalls handelt es sich bei der Darstellung um eine Zeichenfolge in spitzen Klammern, die den Namen des Objekttyps zusammen mit zusätzlichen Informationen enthält oft einschließlich des Namens und der Adresse des Objekts. Eine Klasse kann steuern, was diese Funktion für ihre Instanzen zurückgibt, indem sie eine __repr__()Methode definiert.

Was Sie hier sehen, ist die Standardimplementierung von __repr__, die für die Serialisierung und das Debuggen nützlich ist.

dmazzoni
quelle
5
Ich denke, die Methode der umgekehrten Anführungszeichen (oder "Backticks") zum Abrufen der "Darstellung" eines Objekts ist veraltet und wurde für Version 3.0
MatrixFrog
MatrixFrog: beides stimmt, aber die aktuelle 2.x-Dokumentation sagt dies immer noch, woher das Zitat stammt.
Für viele Objekte sind __repr__ und __str__ dieselbe Funktion. Wenn Sie nur __str__ definieren, ruft __repr__ standardmäßig nur __str__ auf. Der offensichtlichste Fall, in dem dies nicht zutrifft, sind die Zeichenfolgen selbst: str ('stackoverflow') gibt zurück stackoverflow, repr ('stackoverflow') jedoch 'stackoverflow'.
MatrixFrog
6
Sie haben das rückwärts, __repr__ verwendet nie __str__, aber das Gegenteil könnte passieren. Siehe docs.python.org/reference/…
13

__repr__wird vom eigenständigen Python-Interpreter verwendet, um eine Klasse im druckbaren Format anzuzeigen. Beispiel:

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

In Fällen, in denen eine __str__Methode nicht in der Klasse definiert ist, wird die __repr__Funktion aufgerufen , um eine druckbare Darstellung zu erstellen.

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

Außerdem wird print()die Klasse __str__standardmäßig aufgerufen .


Dokumentation , bitte


quelle
7

Die __repr__ -Methode teilt Python einfach mit, wie Objekte einer Klasse gedruckt werden sollen

Jasper Kinoti
quelle
1

Ein Beispiel, um die Unterschiede zwischen ihnen zu sehen (ich habe aus dieser Quelle kopiert ),

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

Die Rückgaben von repr()und str()sind identisch für int x, aber es gibt einen Unterschied zwischen den Rückgabewerten für str y- einer ist formal und der andere ist informell . Einer der wichtigsten Unterschiede zwischen der formellen und der informellen Darstellung besteht darin, dass die Standardimplementierung __repr__für einen str-Wert als Argument für die Bewertung aufgerufen werden kann und der Rückgabewert ein gültiges Zeichenfolgenobjekt wie folgt wäre:

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

Wenn Sie versuchen, den Rückgabewert von __str__als Argument für eval aufzurufen , ist das Ergebnis nicht gültig.

Anh-Thi DINH
quelle
1

Wenn wir neue Typen erstellen, indem wir Klassen definieren, können wir bestimmte Funktionen von Python nutzen, um die Verwendung der neuen Klassen zu vereinfachen. Eine dieser Eigenschaften sind "spezielle Methoden", auch als "magische Methoden" bezeichnet.

Spezielle Methoden haben Namen, die mit zwei Unterstrichen beginnen und enden. Wir definieren sie, nennen sie aber normalerweise nicht direkt beim Namen. Stattdessen werden sie unter bestimmten Umständen automatisch ausgeführt.

Es ist praktisch, den Wert einer Instanz eines Objekts mithilfe einer print-Anweisung ausgeben zu können. Wenn wir dies tun, möchten wir, dass der Wert in der Ausgabe in einem verständlichen, eindeutigen Format dargestellt wird. Die Repr- Spezialmethode kann verwendet werden, um dies zu veranlassen. Wenn wir diese Methode definieren, kann sie automatisch aufgerufen werden, wenn wir den Wert einer Instanz einer Klasse drucken, für die wir diese Methode definiert haben. Es sollte jedoch erwähnt werden, dass es auch eine ist str spezielle Methode, für ein ähnliches verwendet, aber nicht identisch Zweck, die Vorrang erhalten können, wenn wir sie auch definiert haben.

Wenn wir die repr- Methode für die Point3D-Klasse nicht definiert und my_point als Instanz von Point3D instanziiert haben, tun wir dies ...

print my_point ... wir können dies als Ausgabe sehen ...

Nicht sehr schön, oder?

Wir definieren also die spezielle Methode repr oder str oder beides, um eine bessere Ausgabe zu erzielen.

**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**

Ausgabe ...

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

Ashish Anand
quelle