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"☺"
).
Я понимаю, что некоторые могут найти это спорным.