Existe-t-il une convention python pour le moment où vous devez implémenter __str__()
versus __unicode__()
. J'ai vu des classes remplacer __unicode__()
plus fréquemment que __str__()
cela, mais cela ne semble pas être cohérent. Existe-t-il des règles spécifiques lorsqu'il est préférable de mettre en œuvre l'une par rapport à l'autre? Est-il nécessaire / bonne pratique de mettre en œuvre les deux?
213
__unicode__
et effectuez uniquementstr(obj)
?unicode
soulève unNameError
sur Python 3, est un modèle simple qui fonctionne à la fois sur 2 et 3?future
paquet fournit égalementpython_2_unicode_compatible
sans avoir Django comme dépendance.Si je ne m'intéressais pas particulièrement à la micro-optimisation de la chaîne de caractères pour une classe donnée, je mettrais toujours en œuvre
__unicode__
uniquement, car c'est plus général. Lorsque je me soucie de problèmes de performances aussi minimes (ce qui est l'exception, pas la règle), avoir__str__
seulement (quand je peux prouver qu'il n'y aura jamais de caractères non ASCII dans la sortie stringifiée) ou les deux (lorsque les deux sont possibles), pourrait Aidez-moi.Je pense que ce sont des principes solides, mais dans la pratique, il est très courant de SAVOIR qu'il n'y aura que des caractères ASCII sans faire d'effort pour le prouver (par exemple, la forme stringifiée n'a que des chiffres, de la ponctuation et peut-être un nom ASCII court ;-) dans lequel cas, il est assez typique de passer directement à l'
__str__
approche "juste " (mais si une équipe de programmation avec laquelle j'ai travaillé a proposé une directive locale pour éviter cela, je serais +1 sur la proposition, car il est facile de se tromper sur ces questions ET "l'optimisation prématurée est la racine de tout mal dans la programmation" ;-).la source
Le monde devenant plus petit, il est probable que toute chaîne que vous rencontrerez contiendra éventuellement Unicode. Donc, pour toute nouvelle application, vous devez au moins fournir
__unicode__()
. Que vous outrepassiez également ce__str__()
n'est qu'une question de goût.la source
Si vous travaillez à la fois en python2 et en python3 dans Django, je recommande le décorateur python_2_unicode_compatible:
Comme indiqué dans les commentaires précédents d'une autre réponse, certaines versions de future.utils prennent également en charge ce décorateur. Sur mon système, j'avais besoin d'installer un futur module plus récent pour python2 et d'installer future pour python3. Après cela, voici un exemple fonctionnel:
Voici un exemple de sortie (où venv2 / venv3 sont des instances de virtualenv):
la source
Python 2: implémentez __str __ () uniquement et renvoyez un unicode.
Lorsque
__unicode__()
est omis et que quelqu'un appelleunicode(o)
ouu"%s"%o
, Python appelleo.__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 appellestr(o)
ou"%s"%o
, Python revientrepr(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 destr()
?Implémentez à la fois
__str__()
(éventuellement le retourstr
) 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":)"
pouru"☺"
).Je me rends compte que certains peuvent trouver cela controversé.
la source
Il convient de signaler à ceux qui ne connaissent pas la
__unicode__
fonction certains des comportements par défaut qui l'entourent dans Python 2.x, en particulier lorsqu'ils sont définis côte à côte avec__str__
.donne la sortie console suivante ...
Maintenant, quand je commente le
__str__
méthodela source