Frage

Ich habe über repr in Python gelesen. Ich habe mich gefragt, was die Anwendung der Ausgabe von repr ist. z.

class A:
 pass

repr(A) ='<class __main__.A at 0x6f570>'

b=A()
repr(b) = '<__main__.A instance at 0x74d78>'

Wenn würde man in '<class __main__.A at 0x6f570>' or'<__main__.A instance at 0x74d78>' interessiert sein?

War es hilfreich?

Lösung

Manchmal muss man mit oder vorhanden, um eine Bytestring behandeln wie

bob2='bob\xf0\xa4\xad\xa2'

Wenn Sie diese aus (in Ubuntu) drucken Sie bekommen

In [62]: print(bob2)
bob𤭢

, die nicht sehr hilfreich, um andere versuchen, Ihr Bytestring zu verstehen. In den Kommentaren, weist darauf hin, dass John in Windows, print(bob2) Ergebnisse in so etwas wie bob𤭢. Das Problem ist, dass Python die Standard-Kodierung des Terminal / Konsole und versucht erkennt an, daß die Codierung nach der Bytefolge zu dekodieren. Da Ubuntu und Windows unterschiedliche Standard-Kodierungen verwendet (möglicherweise utf-8 und cp1252 respectively), ergeben sich unterschiedliche Ergebnisse.

Im Gegensatz dazu die repr eines Strings ist eindeutig:

In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'

Wenn die Leute Fragen hier auf SO über Python-Strings zu veröffentlichen, werden sie oft gebeten, die repr der Zeichenfolge zu zeigen, so dass wir sicher wissen, welche Zeichenfolge sie es zu tun.

Generell sollte die repr eine eindeutige String-Darstellung des Objekts sein. repr(obj) ruft die obj Methode des Objekts __repr__. Da in Ihrem Beispiel ist die Klasse A keine eigene __repr__ Methode hat repr(b) Resorts auf denen die Klasse und Speicheradresse.

Sie können die __repr__ Methode überschreiben, relevantere Informationen zu geben.


In Ihrem Beispiel '<__main__.A instance at 0x74d78>' sagt uns zwei nützliche Dinge:

  1. , dass b ist eine Instanz der Klasse A im __main__ Namespace
  2. und dass sich das Objekt befindet in Speicher an der Adresse 0x74d78.

Sie zum Beispiel könnte, haben zwei Instanzen der Klasse A. Wenn sie die gleiche Speicheradresse haben, dann wissen Sie, würden sie „zeigen“ auf die gleiche zugrunde liegende Objekt. (Beachten Sie diese Informationen können auch unter Verwendung von id erhalten werden).

Andere Tipps

Theoretisch sollte repr(obj) ausspucken einen String, so dass sie in eval zugeführt werden können, um das Objekt neu erstellen. Mit anderen Worten:

obj2 = eval(repr(obj1))

sollte das Objekt wiederzugeben.

In der Praxis ist repr oft eine "Lite" -Version von str. str könnte eine menschenlesbare Form des Objekts, während repr drucken Informationen wie die Klasse des Objekts drucken, in der Regel für Debugging-Zwecke. Aber die Nützlichkeit hängt viel von Ihrer Situation und wie das Objekt in Frage Griff repr.

Der Hauptzweck des repr() ist, dass es in dem interaktiven Interpreter und im Debugger-Format Objekte in lesbarer Form verwendet wird. Das Beispiel, das Sie gab, ist in erster Linie nützlich für Debugging-Zwecke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top