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