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 à unicode
partir __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_literals
en 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é.