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ą unicodeod __str__()?
Jeśli __str__()zwraca kod Unicode, Python automatycznie konwertuje go na strkodowanie 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_literalsna 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.