Python 2: implémentez __str __ () uniquement et renvoyez un unicode.
Lorsque __unicode__()est omis et que quelqu'un appelle unicode(o)ou u"%s"%o, Python appelle o.__str__()et convertit en unicode en utilisant l'encodage système. (Voir la documentation de__unicode__() .)
L'inverse n'est pas vrai. Si vous implémentez __unicode__()mais pas __str__(), alors quand quelqu'un appelle str(o)ou "%s"%o, Python revient repr(o).
Raisonnement
Pourquoi serait - il travailler pour revenir un à unicodepartir __str__()?
Si __str__()renvoie un unicode, Python le convertit automatiquement enstr utilisant l'encodage système.
Quel est l'avantage?
① Cela vous évite de vous soucier de l’encodage du système (c.-à locale.getpreferredencoeding(…)-d.). Non seulement c'est désordonné, personnellement, mais je pense que c'est quelque chose que le système devrait prendre en charge de toute façon. ② Si vous faites attention, votre code peut sortir compatible avec Python 3, dans lequel__str__() renvoie unicode.
N'est-il pas trompeur de renvoyer un unicode à partir d'une fonction appelée __str__()?
Un peu. Cependant, vous le faites peut-être déjà. Si vous avez from __future__ import unicode_literalsen haut de votre fichier, il y a de fortes chances que vous retourniez un unicode sans même le savoir.
Et Python 3?
Python 3 n'utilise pas __unicode__(). Cependant, si vous implémentez__str__() pour qu'il renvoie unicode sous Python 2 ou Python 3, alors cette partie de votre code sera compatible.
Et si je veux unicode(o)être substantiellement différent de str()?
Implémentez à la fois __str__()(éventuellement le retour str) et __unicode__(). J'imagine que ce serait rare, mais vous voudrez peut-être une sortie substantiellement différente (par exemple, des versions ASCII de caractères spéciaux, comme ":)"pour u"☺").
Je me rends compte que certains peuvent trouver cela controversé.