10
votes

Python Utilisation correcte de __str__ et __repr__

Mon projet actuel nécessite une utilisation intensive de champs de bits. J'ai trouvé un simple et fonctionnel Recette pour bit une classe de champ Mais cela manquait de quelques fonctionnalités dont j'avais besoin, j'ai donc décidé de l'étendre. Je viens de devoir mettre en œuvre __ str __ et __ RECR __ et je veux m'assurer que je suis à la suite de la convention.

__ str __ est censé être informel et conciser, donc je l'ai renvoyé la valeur décimale du champ de bit (c.-à-d. STR (champ de bit 11) serait "3" .

__ RECR __ est censé être une représentation officielle de l'objet, donc j'ai fait renvoyer la chaîne de bits réelle (c.-à-d. REC (champ de bit 11) serait "11" ).

À votre avis, cette implémentation répondrait aux conventions de str et REC ?

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?

acclamations,

Pete


2 commentaires

Il existe des modules de terrain de terrain disponibles, tels que Bitstring, Bitarray et Bitvector (Vérifiez PYPI). Pourrait valoir la peine de les vérifier si vous ne voulez pas réinventer la roue.


Je sais que je réinvente la roue ici, mais je fais ce projet pour le plaisir et c'est insatisfaisant d'utiliser le code Quelqu'un d'autre est écrit dans ce contexte (idiot je sais!).


3 Réponses :


1
votes

J'envisageais d'avoir __ str __ renvoyer une représentation hexadécimale à la place. De cette façon, il est plus facile d'oeil de vue quelles sont les valeurs de bits réelles et donc plus utiles. Mais toujours assez concis (en fait, moins de caractères que la représentation décimale).


0 commentaires

12
votes

Le __ rep __ doit être de préférence une chaîne qui pourrait être utilisée pour recréer l'objet, par exemple si vous utilisez eval dessus - voir les docs ici . Ce n'est pas une science exacte, car elle peut dépendre de la manière dont l'utilisateur de votre module l'importait, par exemple.

je aurais le __ str __ renvoyer la chaîne binaire et le __ RECR __ retour classname (binaire_string) ou tout ce qui pourrait être utilisé pour recréer l'objet.

dans le module Bitstring (que je maintienne) le __ str __ est Hexadecimal Si le bitstring est un multiple de 4 bits de long, sinon il est binaire ou une combinaison des deux. De plus, si le bitstring est très long, il est tronqué (vous ne voulez pas essayer d'imprimer une bite de 100 Mo dans une session interactive!)

J'éviterais d'utiliser la fonction bin () complètement si j'étais vous. La raison étant qu'elle ne peut pas être utilisée si votre bitstring commence avec zéro bits (voir ma question ici ). Je conseillerais d'utiliser l'utilisation d'une méthode ou d'une propriété à la place.


1 commentaires

D'accord. Je pense que comme une règle Eval (REC (REP (X)) doit recréer un X aussi bien que possible. Pas sûr de Str, mais j'aime cette solution.



0
votes

__ RECR __ doit renvoyer quelque chose qui, s'il est passé à votre constructeur, créerait un nouvel objet qui est une copie identique de l'original.

Le vôtre revient '11' mais si vous avez passé "11" à votre constructeur, vous ne recevriez pas le même bitfield en conséquence. Donc ce __ rep __ n'est pas ok.


0 commentaires