Python utilisation correcte de str Et repr
mon projet actuel nécessite une utilisation étendue des champs de bits. J'ai trouvé un moyen simple, fonctionnel recette pour peu un champ de la classe mais il manquait quelques fonctionnalités dont j'avais besoin, alors j'ai décidé de l'étendre. Je viens tout juste de la mise en œuvre de __str__
et __repr__
et je veux m'assurer que je suis à la convention ci-après.
__str__
est censé être informel et concice, donc je l'ai fait retourner la valeur décimale du champ bit (i.e. str(bit field 11)
serait "3"
.
__repr__
est supposé être une représentation officielle de l'objet, donc je l'ai fait retourner la chaîne de bits actuelle (i.e. repr(bit field 11)
"11"
).
à votre avis, cette mise en oeuvre respecterait-elle les conventions pour str
et repr
?
de plus, j'ai utilisé le bin()
fonction pour obtenir la chaîne de bits de la valeur stockée dans la classe. Ce N'est pas compatible avec Python < 2.6, y a-t-il une alternative méthode?
santé,
Pete
3 réponses
__repr__
devrait de préférence être une chaîne qui pourrait être utilisée pour recréer l'objet, par exemple si vous utilisez eval
- voir les docs ici. Ce n'est pas une science exacte, car il peut dépendre de la façon dont l'utilisateur de votre module importé, par exemple.
j'aurais l' __str__
retour de la chaîne binaire, et le __repr__
retour Classname(binary_string)
, ou ce qui pourrait être utilisé pour recréer l'objet.
Dans le bitstring module (dont I maintenir)__str__
est hexadécimal si la chaîne de bits est un multiple de 4 bits de long, sinon c'est soit binaire soit une combinaison des deux. De plus, si le bitstring est très long, il est tronqué (vous ne voulez pas essayer d'imprimer un bitstring de 100 Mo dans une session interactive!)
j'éviterais d'utiliser le bin()
fonction tout à fait si j'étais vous. La raison étant qu'il ne peut pas être utilisé si votre bitstring commence par zéro bits (voir ma question ici). Je conseille à l'aide soit d'utiliser un bin
méthode ou propriété plutôt.
j'envisagerais d'avoir __str__
retourner une représentation hexadécimale à la place. De cette façon, il est plus facile de voir ce que sont les valeurs bit réelles, et donc plus utile. Mais tout de même assez concis (en fait, moins de caractères que la représentation décimale).
__repr__
doit retourner quelque chose qui, s'il était transmis à votre constructeur, créerait un nouvel objet qui serait une copie identique de l'original.
la vôtre renvoie ' 11 'mais si vous passez' 11 ' à votre constructeur, vous n'obtiendrez pas le même bitfield. Donc, ce __repr__
n'est pas ok.