Python 2: Implementieren Sie nur __str __ () und geben Sie einen Unicode zurück.
Wenn __unicode__()
weggelassen wird und jemand unicode(o)
oder anruft u"%s"%o
, ruft Python auf o.__str__()
und konvertiert mithilfe der Systemcodierung in Unicode. (Siehe Dokumentation von__unicode__()
.)
Das Gegenteil ist nicht der Fall. Wenn Sie implementieren, __unicode__()
aber nicht __str__()
, kehrt Python zurück , wenn jemand str(o)
oder anruft ."%s"%o
repr(o)
Begründung
Warum sollte es funktionieren, ein unicode
von zurückzugeben __str__()
?
Wenn __str__()
ein Unicode zurückgegeben wird, konvertiert Python ihn automatisch in str
die Systemcodierung.
Was ist der Vorteil?
① Sie müssen sich keine Gedanken über die Systemcodierung machen (z. B. locale.getpreferredencoeding(…)
). Das ist nicht nur persönlich chaotisch, sondern ich denke, es ist etwas, um das sich das System sowieso kümmern sollte. ② Wenn Sie vorsichtig sind, ist Ihr Code möglicherweise mit Python 3 kompatibel, in dem __str__()
Unicode zurückgegeben wird.
Ist es nicht trügerisch, einen Unicode von einer aufgerufenen Funktion zurückzugeben __str__()
?
Ein wenig. Möglicherweise tun Sie dies jedoch bereits. Wenn Sie from __future__ import unicode_literals
oben in Ihrer Datei stehen, besteht eine gute Chance, dass Sie einen Unicode zurückgeben, ohne es zu wissen.
Was ist mit Python 3?
Python 3 wird nicht verwendet __unicode__()
. Wenn Sie jedoch __str__()
so implementieren , dass Unicode unter Python 2 oder Python 3 zurückgegeben wird, ist dieser Teil Ihres Codes kreuzkompatibel.
Was ist, wenn ich mich unicode(o)
wesentlich von unterscheiden möchte str()
?
Implementieren Sie sowohl __str__()
(möglicherweise zurückgegeben str
) als auch __unicode__()
. Ich stelle mir vor, dass dies selten vorkommt, aber Sie möchten möglicherweise eine wesentlich andere Ausgabe (z. B. ASCII-Versionen von Sonderzeichen, wie ":)"
z u"☺"
. B. für ).
Mir ist klar, dass einige dies kontrovers finden.