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

10
demandé sur Will McCutchen 2010-05-11 21:06:28

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.

12
répondu Scott Griffiths 2017-05-23 10:31:18

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).

1
répondu sblom 2010-05-11 17:10:48

__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.

0
répondu eemz 2010-05-11 17:39:04