2010-08-04 6 views
5

Ich bin nicht sicher, was falsch ich hier tue:Pythons join() wird nicht die Stringdarstellung (__str__) mein Objekts verbindet

>>> class Stringy(object): 
...  def __str__(self): 
...    return "taco" 
...  def __repr__(self): 
...    return "taco" 
... 
>>> lunch = Stringy() 
>>> lunch 
taco 
>>> str(lunch) 
'taco' 
>>> '-'.join(('carnitas',lunch)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence item 1: expected string, Stringy found 

meine Aufnahme der __str__() Methode in der Stringy Gegeben Objekt, sollte nicht join() Mittagessen als String sehen?

Antwort

7

''.join nicht __str__ auf die Elemente der Sequenz nicht nennen es verbindet. Jedes Objekt hat schließlich eine __str__ (sei es nur vererbt von object), also wenn join so funktioniert, würde es irgendeine Sequenz (nach der Verschneidung) - oft zu seltsamen Effekten. Es ist besser, wenn der Benutzer explizit str aufruft, wenn dies gerechtfertigt ist ("explizit ist besser als implizit", ist eines der Mottos in "The Zen of Python").

Sie könnten str oder unicode Unterklasse, wenn Sie eine Zeichenfolge "sein" wollen. Andernfalls wird ein expliziter Aufruf str benötigt, um Instanzen Ihres Typs zu Strings "werden" zu machen.

1

Der Aufruf Signatur für str.join ist:

S.join(sequence) -> string 

Return a string which is the concatenation of the strings in the 
sequence. The separator between elements is S. 

Beachten Sie, dass sequence erwartet wird, eine Folge von Strings zu sein. Viele Objekte haben __str__ Methoden, aber nicht alle von ihnen (wie Stringy) ist eine Instanz von str.

Das Update, natürlich, ist einfach:

'-'.join(('carnitas',str(lunch))) 
12

nicht konvertieren Sie müssen es selbst str

'-'.join(('carnitas',str(lunch))) 

, wenn Sie es für eine ganze Folge von Artikel

zu tun haben
'-'.join(str(x) for x in seq) 

oder

für Ihren speziellen Fall können Sie einfach schreiben

'carnitas-'+str(lunch) 
+0

+1 für die richtige Antwort * und * mit Generator Ausdruck statt der schrecklichen "lass uns eine andere Liste erstellen, weil wir kaum Listenverständnis verstehen" :) – delnan

Verwandte Themen