Python 2: Zaimplementuj tylko __str __ () i zwróć Unicode.
Kiedy __unicode__()
jest pominięty, a ktoś dzwoni unicode(o)
lub u"%s"%o
, Python wywołuje o.__str__()
i konwertuje na Unicode przy użyciu kodowania systemowego. (Zobacz dokumentację__unicode__()
.)
Przeciwnie nie jest prawdą. Jeśli zaimplementujesz, __unicode__()
ale nie __str__()
, to kiedy ktoś zadzwoni str(o)
lub "%s"%o
, Python powróci repr(o)
.
Racjonalne uzasadnienie
Dlaczego to działa na zwracają unicode
od __str__()
?
Jeśli __str__()
zwraca kod Unicode, Python automatycznie konwertuje go na str
kodowanie systemowe.
Jaka jest korzyść?
① Uwalnia od martwienia się o to, czym jest kodowanie systemowe (tj locale.getpreferredencoeding(…)
.). Osobiście jest to nie tylko niechlujne, ale myślę, że i tak powinien się tym zająć. ② Jeśli jesteś ostrożny, twój kod może wyjść kompatybilny z Pythonem 3, w którym __str__()
zwraca Unicode.
Czy zwodnicze jest zwrócenie kodu Unicode z funkcji o nazwie __str__()
?
Trochę. Być może już to robisz. Jeśli masz from __future__ import unicode_literals
na górze pliku, istnieje duża szansa, że zwrócisz Unicode, nawet o tym nie wiedząc.
Co z Python 3?
Python 3 nie używa __unicode__()
. Jeśli jednak zaimplementujesz, __str__()
aby zwracał Unicode w Pythonie 2 lub Pythonie 3, to ta część kodu będzie kompatybilna krzyżowo.
Co jeśli chcę unicode(o)
się zasadniczo różnić od str()
?
Zaimplementuj zarówno __str__()
(możliwe zwrot str
) i __unicode__()
. Wyobrażam sobie, że byłoby to rzadkie, ale możesz chcieć mieć zasadniczo różne dane wyjściowe (np. Wersje znaków specjalnych ASCII, jak ":)"
dla u"☺"
).
Zdaję sobie sprawę, że niektórzy mogą uznać to za kontrowersyjne.