2010-05-11 20 views
10

Mon projet actuel nécessite une utilisation intensive des champs de bits. J'ai trouvé un recipe for bit a field class simple et fonctionnel, mais il manquait quelques fonctionnalités dont j'avais besoin, alors j'ai décidé de l'étendre. Je dois juste mettre en application __str__ et __repr__ et je veux m'assurer que je suis la convention.Utilisation correcte de __str__ et __repr__ par Python

__str__ est censé être informel et concice, donc je l'ai fait revenir la valeur décimale du champ de bits (c.-à-str(bit field 11) serait "3".

__repr__ est censé être une représentation officielle de l'objet, donc je « ai fait revenir la chaîne de bits réelle (c.-à-repr(bit field 11) serait "11").

à votre avis serait cette mise en œuvre des conventions pour répondre aux str et repr?

En outre, j'ai utilisé la fonction bin() pour obtenir la chaîne de bits de la valeur stockée dans la classe. Ce n'est pas compatible avec Python < 2.6, existe-t-il une méthode alternative?

Cheers,

Pete

+2

Des modules de champ de bits sont disponibles, tels que bitstring, bitarray et bitvector (vérifiez sur PyPi). Cela vaut la peine de les vérifier si vous ne voulez pas réinventer la roue. –

+0

Je sais que je suis en train de réinventer la roue ici, mais je fais ce projet pour le plaisir et c'est d'une certaine manière insatisfaisant d'utiliser du code quelqu'un d'autre est écrit dans ce contexte (idiot je sais!). – Peter

Répondre

12

Le __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 dessus - voir les documents here. Ce n'est pas une science exacte, car cela dépend de la façon dont l'utilisateur de votre module l'a importé, par exemple.

Je voudrais que le __str__ renvoie la chaîne binaire, et le __repr__ renvoie Classname(binary_string), ou tout ce qui pourrait être utilisé pour recréer l'objet.

Dans le module bitstring (que je maintiens) le __str__ est hexadécimal si la chaîne de bits est un multiple de 4 bits, sinon c'est binaire ou une combinaison des deux. Aussi, si la chaîne de bits est très longue, elle est tronquée (vous ne voulez pas essayer d'imprimer une chaîne binaire de 100 Mo dans une session interactive!)

J'éviterais d'utiliser la fonction bin() si j'étais vous. La raison en est qu'il ne peut pas être utilisé si votre chaîne de bits commence par zéro bits (voir ma question here). Je conseille d'utiliser soit une méthode bin ou une propriété à la place.

+4

D'accord.Je pense en règle générale que eval (repr (x)) devrait recréer x aussi bien que possible. pas sûr de str, mais j'aime cette solution. – Claudiu

1

Je considérerais avoir __str__ retour une représentation hexadécimale au lieu. De cette façon, il est plus facile de voir quelles sont les valeurs de bits réelles, et donc plus utiles. Mais encore assez concis (en fait, moins de caractères que la représentation décimale).

0

__repr__ doit renvoyer quelque chose qui, s'il est transmis à votre constructeur, créera un nouvel objet qui est une copie identique de l'original.

La valeur "11" est renvoyée, mais si vous transmettez '11' à votre constructeur, vous n'obtiendrez pas le même champ de bits. Donc ce __repr__ n'est pas correct.