Python 2: Реализуйте только __str __ () и возвращайте юникод.
Когда __unicode__()опущено и кто-то вызывает unicode(o)или u"%s"%o, Python вызывает o.__str__()и конвертирует в Unicode, используя системную кодировку. (См. Документацию__unicode__() .)
Обратное не верно. Если вы реализуете, __unicode__()но нет __str__(), тогда, когда кто-то вызывает str(o)или "%s"%o, Python возвращается repr(o).
обоснование
Почему бы работать, чтобы вернуть unicodeиз __str__()?
Если __str__()возвращает юникод, Python автоматически конвертирует его strв системную кодировку.
В чем выгода?
① Это освобождает вас от беспокойства о том, что такое системная кодировка (т.е. locale.getpreferredencoeding(…)). Мало того, что это грязно, лично, но я думаю, что система должна заботиться в любом случае. ② Если вы осторожны, ваш код может оказаться кросс-совместимым с Python 3, в котором __str__()возвращается юникод.
Разве не обманчиво возвращать юникод из вызываемой функции __str__()?
Немного. Тем не менее, вы, возможно, уже делаете это. Если у вас есть from __future__ import unicode_literalsверхняя часть файла, есть большая вероятность, что вы вернете юникод, даже не зная об этом.
А как насчет Python 3?
Python 3 не использует __unicode__(). Однако, если вы реализуете __str__()так, что он возвращает юникод в Python 2 или Python 3, то эта часть вашего кода будет кросс-совместимой.
Что, если я хочу unicode(o)существенно отличаться от str()?
Реализуйте оба __str__()(возможно, возвращение str) и __unicode__(). Я предполагаю, что это было бы редко, но вы могли бы хотеть существенно различного вывода (например, ASCII-версии специальных символов, например, ":)"для u"☺").
Я понимаю, что некоторые могут найти это спорным.