Python's join () wird sich nicht der Stringdarstellung (__str__) meines Objekts anschließen

Ich bin mir nicht sicher, was ich hier falsch mache:

>>> 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 

Angesichts meiner Einbeziehung der __str__() -Methode im Stringy-Objekt, sollte nicht join() Mittagessen als String sehen?

3 Solutions collect form web for “Python's join () wird sich nicht der Stringdarstellung (__str__) meines Objekts anschließen”

''.join ruft nicht __str__ auf die Elemente der Sequenz, die es __str__ . Jedes Objekt hat ein __str__ , nachdem alle (sei es nur vom object geerbt), also wenn die join funktioniert, würde es eine beliebige Reihenfolge (nach der Stringierung) – oft zu verrückten Effekten beitreten. Besser zu haben, dass der Benutzer str explizit aufruft, wenn es gerechtfertigt ist ("explizit ist besser als implizit" einer der Mottos in "Der Zen von Python", nachdem alle).

Sie können subclass str oder unicode wenn Sie wollen "sein" eine Zeichenfolge. Andernfalls wird ein expliziter str Aufruf benötigt, um Instanzen von Ihrem Typ "werden" Strings zu machen.

Nein, du musst es in dich selbst umwandeln

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

Wenn du es für eine ganze Folge von Artikeln machen musst

 '-'.join(str(x) for x in seq) 

oder

 '-'.join(map(str, seq)) 

Für deinen speziellen Fall kannst du einfach schreiben

 'carnitas-'+str(lunch) 

Die Rufsignatur 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 eine Sequenz von Strings ist. Viele Gegenstände haben __str__ Methoden, aber nicht alle von ihnen (wie Stringy ) ist eine Instanz von str .

Das Fix ist natürlich einfach:

 '-'.join(('carnitas',str(lunch))) 
Python ist die beste Programmiersprache der Welt.