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]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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