Gibt es eine Python - Konvention für , wenn Sie implementieren sollten __str__()
gegenüber __unicode__()
. Ich habe gesehen, dass Klassen __unicode__()
häufiger überschrieben werden als, __str__()
aber es scheint nicht konsistent zu sein. Gibt es bestimmte Regeln, wenn es besser ist, eine gegen die andere zu implementieren? Ist es notwendig / gute Praxis, beide umzusetzen?
quelle
__unicode__
und dann tunstr(obj)
?unicode
löst einNameError
auf Python 3 aus, ist ein einfaches Muster, das sowohl für 2 als auch für 3 funktioniert?future
Paket bietet auchpython_2_unicode_compatible
ohne Django als Abhängigkeit.Wenn mir die mikrooptimierende Stringifizierung für eine bestimmte Klasse nicht besonders wichtig wäre, würde ich sie immer implementieren
__unicode__
nur , da dies allgemeiner ist. Wenn ich mich um so winzige Leistungsprobleme kümmere (was die Ausnahme und nicht die Regel ist),__str__
kann es sein , dass ich nur (wenn ich nachweisen kann, dass die String-Ausgabe niemals Nicht-ASCII-Zeichen enthält) oder beides (wenn beide möglich sind) Hilfe.Ich denke, dies sind solide Prinzipien, aber in der Praxis ist es sehr üblich zu WISSEN, dass es nur ASCII-Zeichen gibt, ohne sich darum zu bemühen, dies zu beweisen (z. B. enthält die Zeichenfolge nur Ziffern, Satzzeichen und möglicherweise einen kurzen ASCII-Namen ;-), in dem In diesem Fall ist es recht typisch, direkt zum "gerechten
__str__
" Ansatz überzugehen (aber wenn ein Programmierteam, mit dem ich zusammengearbeitet habe, eine lokale Richtlinie vorschlägt, um dies zu vermeiden, würde ich +1 für den Vorschlag erhalten, da es in diesen Angelegenheiten leicht ist, Fehler zu machen UND "Vorzeitige Optimierung ist die Wurzel allen Übels in der Programmierung" ;-).quelle
Wenn die Welt kleiner wird, besteht die Möglichkeit, dass jede Zeichenfolge, auf die Sie stoßen, irgendwann Unicode enthält. Für neue Apps sollten Sie also zumindest bereitstellen
__unicode__()
. Ob Sie auch überschreiben,__str__()
ist dann nur Geschmackssache.quelle
Wenn Sie in Django sowohl in Python2 als auch in Python3 arbeiten, empfehle ich den Dekorator python_2_unicode_compatible:
Wie in früheren Kommentaren zu einer anderen Antwort erwähnt, unterstützen einige Versionen von future.utils auch diesen Dekorateur. Auf meinem System musste ich ein neueres zukünftiges Modul für Python2 und Future für Python3 installieren. Danach ist hier ein Funktionsbeispiel:
Hier ist eine Beispielausgabe (wobei venv2 / venv3 virtuelle Instanzen sind):
quelle
Python 2: Implementieren Sie nur __str __ () und geben Sie einen Unicode zurück.
Wenn
__unicode__()
weggelassen wird und jemandunicode(o)
oder anruftu"%s"%o
, ruft Python aufo.__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 jemandstr(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 instr
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öchtestr()
?Implementieren Sie sowohl
__str__()
(möglicherweise zurückgegebenstr
) 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":)"
zu"☺"
. B. für ).Mir ist klar, dass einige dies kontrovers finden.
quelle
Es lohnt sich, diejenigen, die mit der
__unicode__
Funktion nicht vertraut sind, auf einige der Standardverhaltensweisen hinzuweisen, die sie in Python 2.x umgeben, insbesondere wenn sie nebeneinander definiert werden__str__
.ergibt die folgende Konsolenausgabe ...
Nun, wenn ich die
__str__
Methode auskommentierequelle