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 ?
Réponses
Trop de publicités?__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.
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";-).