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 unicodepartir de __str__()?
Se __str__()retornar um unicode, o Python o converterá automaticamente strusando 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_literalsna 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.