2010-03-01 9 views

Antwort

60

Hintergrund:

In Python gibt es zwei eingebauten Funktionen zum Drehen eines Objekts in einen String: str vs. repr. str soll eine freundliche, menschenlesbare Zeichenfolge sein. repr soll detaillierte Informationen über den Inhalt eines Objekts enthalten (manchmal geben sie dasselbe zurück, z. B. für ganze Zahlen). Wenn es einen Python-Ausdruck gibt, der auf ein anderes Objekt ausgibt, das == ist, gibt repr einen solchen Ausdruck, z.

 
>>> print repr('hi') 
'hi' # notice the quotes here as opposed to... 
>>> print str('hi') 
hi 

Wenn Sie einen Ausdruck der Rückkehr Sinn machen, nicht für ein Objekt, sollte repr eine Zeichenfolge zurück, die beispielsweise durch < und> Symbole umgeben ist <blah>.

Ihre ursprüngliche Frage zu beantworten:

%s < ->str
%r < ->repr

Zusätzlich:

Sie können die Art und Weise eine Instanz Ihrer eigenen Klassen steuern konvertieren Zeichenketten durch Implementierung der Methoden und __repr__.

class Foo: 

    def __init__(self, foo): 
    self.foo = foo 

    def __eq__(self, other): 
    """Implements ==.""" 
    return self.foo == other.foo 

    def __repr__(self): 
    # if you eval the return value of this function, 
    # you'll get another Foo instance that's == to self 
    return "Foo(%r)" % self.foo 
+7

I% r gefunden habe zum Drucken eine Reihe von unbekannter Codierung, wenn sonst ein Fehler nützlich zu sein kann mit% s geworfen bekommen – dan

20

Es ruft repr() auf das Objekt und fügt die resultierende Zeichenfolge ein.

4

Es druckt den Ersatz als eine Zeichenfolge mit repr().

0

Siehe String Formatting Operations in der Dokumentation. Beachten Sie, dass% s und% d usw. anders funktionieren als erwartet, wenn Sie daran gewöhnt sind, wie sie in einer anderen Sprache arbeiten.

Insbesondere funktioniert% s auch gut für Ints und Floats, außer Sie haben spezielle Formatierungsanforderungen, wo% d oder% f mehr Kontrolle geben.

3

Zusätzlich zu den Antworten oben angegebenen, kann '%r' in einem Szenario nützlich sein, wenn Sie eine Liste mit heterogenem Datentyp haben. Nehmen wir an, wir haben eine list = [1, 'apple' , 2 , 'r','banana'] Offensichtlich in diesem Fall mit '%d' oder '%s' würde einen Fehler verursachen. Stattdessen können wir '%r' verwenden, um alle diese Werte zu drucken.

+0

Bitte bearbeiten Sie Ihre Antwort – Rajesh

0
%s <=> str 
%r <=> repr 

%r Anrufe repr() auf das Objekt, und fügt den resultierenden String zurück durch __repr__.

Die von __repr__ zurückgegebene Zeichenfolge sollte eindeutig sein und, wenn möglich, mit dem Quellcode übereinstimmen, der zum Wiederherstellen des dargestellten Objekts erforderlich ist.

Ein kurzes Beispiel:

class Foo: 

    def __init__(self, foo): 
     self.foo = foo 


    def __repr__(self): 
     return 'Foo(%r)' % self.foo 

    def __str__(self): 
     return self.foo 


test = Foo('Text') 

So

in[1]: test 
Out[1]: Foo('Text') 


in[2]: str(test) 
Out[2]: 'Text'