Grundlegendes zur Funktion repr () in Python

151

repr(): auswertbare Zeichenfolgendarstellung eines Objekts (kann es "eval ()", dh es ist eine Zeichenfolgendarstellung, die als Python-Objekt ausgewertet wird)

Mit anderen Worten:

>>> x = 'foo'
>>> repr(x)
"'foo'"

Fragen:

  1. Warum bekomme ich doppelte Anführungszeichen, wenn ich das tue repr(x)? (Ich bekomme sie nicht, wenn ich es tue str(x))
  2. Warum bekomme ich, 'foo'wenn ich es tue eval("'foo'")und nicht x, welches das Objekt ist?
0101amt
quelle

Antworten:

165
>>> x = 'foo'
>>> x
'foo'

Der Name xwird also an die 'foo'Zeichenfolge angehängt . Wenn Sie zum Beispiel anrufen, repr(x)setzt der Interpreter 'foo'statt xund ruft dann auf repr('foo').

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

reprruft tatsächlich eine magische Methode __repr__von auf x, die die Zeichenfolge angibt, die die Darstellung des 'foo'zugewiesenen Werts enthält x. Es kehrt also 'foo'innerhalb der Zeichenfolge zurück, ""was zu führt "'foo'". Die Idee von reprist, eine Zeichenfolge anzugeben, die eine Reihe von Symbolen enthält, die wir in den Interpreter eingeben können, und denselben Wert zu erhalten, an den als Argument gesendet wurde repr.

>>> eval("'foo'")
'foo'

Wenn wir anrufen eval("'foo'"), ist es dasselbe, wie wir 'foo'den Interpreter eingeben. Es ist so, als würden wir den Inhalt der äußeren Zeichenfolge direkt ""in den Interpreter eingeben.

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

Wenn wir anrufen eval('foo'), ist es dasselbe, wie wir fooden Interpreter eingeben. Es ist jedoch keine fooVariable verfügbar und eine Ausnahme wird ausgelöst.

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

strist nur die Zeichenfolgendarstellung des Objekts (denken Sie daran, xVariable bezieht sich auf 'foo'), daher gibt diese Funktion eine Zeichenfolge zurück.

>>> str(5)
'5'

Zeichenfolgendarstellung der Ganzzahl 5ist '5'.

>>> str('foo')
'foo'

Die Zeichenfolgendarstellung der Zeichenfolge 'foo'ist dieselbe Zeichenfolge 'foo'.

Ovgolovin
quelle
Können Sie uns auch einige Anwendungsfälle mitteilen, in denen die Repr-Funktion verwendet werden sollte? Ich kann das nicht verstehen
Gaurav Parashar
14

Das Feedback, das Sie zum interaktiven Interpreter erhalten, wird ebenfalls verwendet repr. Wenn Sie einen Ausdruck eingeben (lassen Sie es sein expr), tut dies der Interpreter im Grunde result = expr; if result is not None: print repr(result). So ist die zweite Zeile in Ihrem Beispiel wird die Zeichenfolge Formatierung fooin die Darstellung wollen Sie ( 'foo'). Und dann erstellt der Dolmetscher die reprDarstellung davon und hinterlässt doppelte Anführungszeichen.

Warum, wenn ich% r mit Escapezeichen in doppelten und einfachen Anführungszeichen kombiniere und sie ausdrucke, wird es so gedruckt, wie ich es in meine .py-Datei geschrieben habe, aber nicht so, wie ich es gerne sehen würde?

Ich bin mir nicht sicher, was Sie hier fragen. Der Text enthält single ' and double " quotesbeim Durchlaufen reprEscapezeichen für eine Art von Zitat. Natürlich, sonst wäre es nach Python-Regeln kein gültiges String-Literal. Genau darum haben Sie gebeten repr.

Beachten Sie auch, dass die eval(repr(x)) == xAnalogie nicht wörtlich gemeint ist. Dies ist eine Annäherung und gilt für die meisten (alle?) Integrierten Typen. Hauptsache, Sie erhalten eine ziemlich gute Vorstellung von Typ und logischem "Wert", wenn Sie die reprAusgabe betrachten.

Vlad
quelle
2
Ursprünglich es tatsächlich war seine wörtlichen gemeint: jeder Wert das reprentweder etwas sein soll, die übergeben werden kann eval(oder kopiert und eingefügt in die Quelltext) einen gleichen Wert zu erzeugen, oder etwas , das eine Syntax erhöhen wird , wenn Sie versuchen , dass ( in der Regel der <…>Stil von object.__repr__). Das wurde im Laufe der Jahre schrittweise abgeschwächt, und um 2.7 und 3.x ist es nur "für viele Typen" wahr, und es gibt sogar Ausnahmen in der stdlib (z. B. ein namedtupleals lokal erstellter Typ gibt Ihnen eine Möglichkeit, die reprSie können). t eval), aber es war die ursprüngliche Idee.
Abarnert
7

str () wird zum Erstellen der Ausgabe für den Endbenutzer verwendet, während repr () für die Debuggin-Entwicklung verwendet wird. Und es repräsentiert den Beamten des Objekts.

Beispiel:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

Aus der Ausgabe geht hervor, dass repr () die offizielle Darstellung des Datumsobjekts zeigt.

Tanim_113
quelle
3

1) Das Ergebnis von repr('foo')ist die Zeichenfolge 'foo' . In Ihrer Python-Shell wird das Ergebnis des Ausdrucks auch als Darstellung ausgedrückt, sodass Sie im Wesentlichen sehen repr(repr('foo')).

2) evalberechnet das Ergebnis eines Ausdrucks. Das Ergebnis ist immer ein Wert (z. B. eine Zahl, eine Zeichenfolge oder ein Objekt). Mehrere Variablen können sich auf denselben Wert beziehen, wie in:

x = 'foo'
y = x

x und y beziehen sich jetzt auf denselben Wert.

3) Ich habe keine Ahnung, was Sie hier gemeint haben. Können Sie ein Beispiel posten und was Sie sehen möchten?

Phihag
quelle
1

Wenn du sagst

foo = 'bar'
baz(foo)

Sie gehen nicht foozur bazFunktion über. fooist in diesem Fall nur ein Name, der zur Darstellung eines Werts verwendet wird 'bar', und dieser Wert wird an die bazFunktion übergeben.

SingleNegationElimination
quelle