4 Stimmen

Im Python KOMAT, was ist der Unterschied zwischen dem "Drucken" einer Variablen und dem einfachen Schreiben der Variablen?

Bei dem IDLE-Interpreter mache ich folgendes mit dpkt:

for ts, buf in pcap:
  eth = dpkt.ethernet.Ethernet(buf)

Jetzt, wenn ich versuche, den Inhalt von 'eth' zu sehen, kann ich es entweder drucken oder einfach den Variablennamen schreiben.

Wenn ich Folgendes mache:

print eth

Erhalte ich:

O&áÿE(r @,ò
DYP?Jò}PªpÉ

Jedoch, wenn ich einfach schreibe:

eth

Bekomme ich die erwartete Ausgabe von:

Ethernet(src='', dst='', data=IP(src='', off=16384, dst='', sum=11506, len=40, p=6, ttl=128, id=29344, data=TCP(seq=2527752393, ack=218580057, win=16202, sum=62077, flags=16, dport=80, sport=51626)))

Also meine Frage ist, was ist der grundlegende Unterschied zwischen "print (variable)" und nur den Variablennamen schreiben? Wenn ich eine einfache Zuweisung mache (z.B. "x = 100"), bekomme ich sowohl bei "print x" als auch bei "x" das Ergebnis "100".

10voto

gecco Punkte 16459

print(variable) entspricht print(str(variable))

während

variable entspricht print(repr(variable))

Meine Vermutung ist, dass die __repr__ und __str__ Methode der Klasse dpkt.ethernet.Ethernet diese völlig unterschiedlichen Ergebnisse produzieren.

Aktualisierung: Ein Blick auf den Quellcode bestätigt meine Vermutung.

3voto

HardlyKnowEm Punkte 3128

Es gibt zwei Funktionen, um Daten als Zeichenfolge in Python darzustellen: repr() und str().

Wenn Sie eine print-Anweisung verwenden, wird die str-Funktion für die Argumente aufgerufen, die Sie für die print-Anweisung bereitgestellt haben (und am Ende wird eine neue Zeile angehängt). Zum Beispiel wird x = 100; print x str(x) aufrufen. Das Ergebnis ("100") wird um eine neue Zeile erweitert und an den stdout gesendet.

Wenn Sie etwas anderes als eine print-Anweisung ausführen, gibt der Interpreter den Wert aus, den der Ausdruck mit repr ergibt, es sei denn, der Wert ist None, in diesem Fall wird nichts ausgegeben.

In den meisten Fällen gibt es nur subtile Unterschiede zwischen den beiden. Objekte definieren jedoch oft ihre eigenen verschiedenen __str__ und __repr__ Methoden (die das Verhalten für die integrierten Funktionen str und repr für dieses Objekt definieren). In Ihrem Beispiel muss die __repr__ Methode des eth Objekts sich von der __str__ Methode unterscheiden.

Ich würde vermuten, dass die __str__ Methode eine binäre Zeichenfolgenrepräsentation des Objekts zurückgibt, um über ein Netzwerk zu senden, aber sicher bin ich mir nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X