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__()
повертається unicode.
Чи не оманливо повертати унікод з функції, що називається __str__()
?
Трішки. Однак ви, можливо, це вже робите. Якщо у вас є from __future__ import unicode_literals
у верхній частині файлу, є хороший шанс повернути unicode, навіть не підозрюючи про це.
Що з Python 3?
Python 3 не використовує __unicode__()
. Однак якщо ви реалізуєте __str__()
так, що він повертає unicode під будь-яким Python 2 або Python 3, то ця частина вашого коду буде сумісною.
Що робити, якщо я хочу unicode(o)
істотно відрізнятися від str()
?
Виконайте як __str__()
(можливо повернення str
), так і __unicode__()
. Я думаю, що це буде рідко, але ви, можливо, захочете істотно іншого виводу (наприклад, ASCII версії спеціальних символів, як ":)"
для u"☺"
).
Я усвідомлюю, що деякі можуть вважати це спірним.