Python 2: implemente apenas __str __ () e retorne um unicode.
Quando __unicode__()
é omitido e alguém chama unicode(o)
ou u"%s"%o
, Python chama o.__str__()
e converte em unicode usando a codificação do sistema. (Veja a documentação de__unicode__()
.)
O oposto não é verdadeiro. Se você implementar, __unicode__()
mas não __str__()
, quando alguém chamar str(o)
ou "%s"%o
, o Python retornará repr(o)
.
Fundamentação
Por que isso funciona para retornar a unicode
partir de __str__()
?
Se __str__()
retornar um unicode, o Python o converterá automaticamente str
usando a codificação do sistema.
Qual o benefício?
① Isso evita que você se preocupe com o que é a codificação do sistema (ou seja, locale.getpreferredencoeding(…)
). Não é apenas isso confuso, pessoalmente, mas acho que é algo que o sistema deve resolver de qualquer maneira. ② Se você for cuidadoso, seu código pode ser compatível com o Python 3, no qual __str__()
retorna unicode.
Não é enganoso retornar um unicode de uma função chamada __str__()
?
Um pouco. No entanto, você já pode estar fazendo isso. Se você estiver from __future__ import unicode_literals
na parte superior do arquivo, há uma boa chance de retornar um unicode sem nem mesmo saber.
E o Python 3?
Python 3 não usa __unicode__()
. No entanto, se você implementar __str__()
para que ele retorne unicode no Python 2 ou Python 3, essa parte do seu código será compatível com outras versões.
E se eu quiser unicode(o)
ser substancialmente diferente str()
?
Implemente ambos __str__()
(possivelmente retornando str
) e __unicode__()
. Eu imagino que isso seria raro, mas você pode querer uma saída substancialmente diferente (por exemplo, versões ASCII de caracteres especiais, como ":)"
para u"☺"
).
Sei que alguns podem achar isso controverso.