224 votes

Python __str__ versus __unicode__

Y a-t-il un python convention pour quand vous devez implémenter contre . J’ai vu des classes substituer plus fréquemment de mais il ne semble pas être compatible. Y a-t-il des règles particulières lorsqu’il est préférable d’implémenter l’une contre l’autre ? Est-ce nécessaire/bonne pratique à mettre en œuvre les deux ?

268voto

John Millikin Points 86775

__str__() est la vieille méthode, il retourne octets. __unicode__() c'est la nouvelle méthode préférée -- il retourne caractères. Les noms sont un peu confus, mais en 2.x nous sommes coincés avec eux pour des raisons de compatibilité. En général, vous devez mettre toute votre chaîne de formatage en __unicode__(), et de créer un stub __str__() méthode:

def __str__(self):
    return unicode(self).encode('utf-8')

Dans la version 3.0, str contient des caractères, de sorte que les mêmes méthodes sont nommés __bytes__() et __str__(). Celles-ci se passent comme prévu.

24voto

Alex Martelli Points 330805

Si je n'ai pas spécialement de soins sur la micro-optimisation de stringification pour une classe donnée, je serais toujours mettre en oeuvre __unicode__ seulement, car il est plus général. Quand je ne se soucient de ces minutes de problèmes de performances (qui est l'exception, pas la règle), ayant __str__ seulement (quand je peux le prouver il n'y aura jamais des caractères non-ASCII dans le stringified de sortie) ou les deux (quand les deux sont possibles), pourrait aider.

Je pense que ces sont de solides principes, mais dans la pratique, il est très commun de SAVOIR s'il y aura rien, mais les caractères ASCII sans faire l'effort de le prouver (par exemple, la stringified forme seule a les chiffres, la ponctuation, et peut-être un court nom ASCII;-) dans ce cas, c'est tout à fait typique pour passer directement à la "juste __str__" approche (mais si une équipe de programmation, j'ai travaillé avec a proposé un local de directive afin d'éviter que, Je serais +1 sur la proposition, comme il est facile de se tromper dans ces questions ET "l'optimisation prématurée est la racine de tous les maux dans la programmation";-).

15voto

Aaron Digulla Points 143830

Avec le monde devient plus petit, les chances sont que n’importe quelle chaîne que vous rencontrez contiendra éventuellement Unicode. Donc pour les nouvelles applications, vous devez fournir au moins . Si vous substituez également est alors juste une question de goût.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X