unicode, __str__, __ref__ et affichage [résolu]

unicode, __str__, __ref__ et affichage [résolu] - Python - Programmation

Marsh Posté le 29-09-2005 à 10:03:53    

Bonjour à tous !
 
Soit ma classe C :
 

Code :
  1. class C(object) :
  2. ______...
  3. ______def __repr__(self):
  4. ____________return u"ligne unicode\\n"+u"suite sur une nouvelle ligne"


Quand je fais un print C() la fonction __repr__() me renvoie une chaîne sur une seule ligne sans interpréter \n . Le résultat est :  
ligne unicode\nsuite sur une nouvelle ligne
 
Par contre si j'écris __repr()__ ainsi : (sans le format unicode)

Code :
  1. ______def __repr__(self):
  2. ____________return "ligne str\\n"+"suite sur une nouvelle ligne"


j'obtiens bien, après un print C() , deux lignes de résultat. Pourquoi ? __repr__() ne doit renvoyer que le type str, pas le type unicode ?
 
edit : problème pour afficher l'anti-slash dans du code.


Message édité par suizokukan le 29-09-2005 à 11:25:21
Reply

Marsh Posté le 29-09-2005 à 10:03:53   

Reply

Marsh Posté le 29-09-2005 à 10:07:46    

c'est normal, repr est fait pour ça : visualiser tout. ça évite les surprises. Si tu veux du lisible pour humain, utilise __str__.
 
Edit : dans les deux cas, tout dépend du context. print interprète bien tous les caractères. il utilise de préférence __str__. si tu veux l'affichage brut de repr, utilise repr(o)


Message édité par Taz le 29-09-2005 à 10:11:19
Reply

Marsh Posté le 29-09-2005 à 10:21:13    

Merci Taz, je vais récapituler - merci de m'indiquer si je me trompe.
 
Lors d'un appel du genre print C() :
 
* c'est C.__str__() qui est appelée si cette fonction existe. Dans ce cas les caractères spéciaux sont interprétés.
* c'est C.__repr__() qui est appelée si C.__str()__ n'existe pas. Dans ce cas les caractères spéciaux ne sont pas interprétés.
* si aucune de ces deux fonctions n'existe, on a droit au message <C object at 0x...>

Reply

Marsh Posté le 29-09-2005 à 10:49:20    

suizokukan a écrit :

* si aucune de ces deux fonctions n'existe, on a droit au message <C object at 0x...>


C'est l'appel au __repr__ par défaut de l'objet [:spamafote]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 29-09-2005 à 11:02:04    

> d'accord Masklinn.
 
J'ai un autre problème. Si je crée une liste d'objets du genre :

Code :
  1. l = [ C(), C() ]
  2. print l


je me rends compte que c'est toujours C.__repr__() qui est utilisée même quand C.__str__() existe. Pourquoi ? et comment résoudre ce problème ?

Reply

Marsh Posté le 29-09-2005 à 11:24:17    

suizokukan a écrit :

> d'accord Masklinn.
 
J'ai un autre problème. Si je crée une liste d'objets du genre :

Code :
  1. l = [ C(), C() ]
  2. print l


je me rends compte que c'est toujours C.__repr__() qui est utilisée même quand C.__str__() existe. Pourquoi ? et comment résoudre ce problème ?


 :heink:  
 
Ce que tu stockes dans ta liste, ce sont des objets, donc ce qui s'affiche quand tu imprimes ta liste en raw c'est le __repr__, c'est à dire ce qui permet d'identifier (et normalement de reconstruire) les objets, ça me semble logique.
 
Si tu veux imprimer tes objets de manière "humainement lisible", tu fais
 

for i in l: print i,

[:spamafote]


Message édité par masklinn le 29-09-2005 à 11:24:45

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 29-09-2005 à 11:27:55    

> Merci Masklinn et désolé pour cette dernière question, un peu niaise.
 
En passant, j'indique qu'utiliser pprint.pprint( l ) pour afficher la liste ne résout pas le problème.
 
Bonne journée à tous.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed