2010-08-24 3 views
18

Eh bien cet extrait de console python interactif tout dire:Comment appliquer __str__ fonction lors de l'impression d'une liste d'objets en Python

>>> class Test: 
...  def __str__(self): 
...   return 'asd' 
... 
>>> t = Test() 
>>> print(t) 
asd 
>>> l = [Test(), Test(), Test()] 
>>> print(l) 
[__main__.Test instance at 0x00CBC1E8, __main__.Test instance at 0x00CBC260, 
__main__.Test instance at 0x00CBC238] 

Fondamentalement, je voudrais obtenir trois cordes asd imprimé lorsque j'imprime la liste. J'ai aussi essayé pprint mais ça donne les mêmes résultats.

Répondre

3

Vous devez faire une méthode __repr__:

>>> class Test: 
    def __str__(self): 
     return 'asd' 
    def __repr__(self): 
     return 'zxcv' 


>>> [Test(), Test()] 
[zxcv, zxcv] 
>>> print _ 
[zxcv, zxcv] 

Reportez-vous à la docs:

object.__repr__(self)

Appelée par la fonction intégrée repr() et par conversions de chaîne (guillemets) pour calculer la représentation de chaîne "officielle" d'un objet. Dans la mesure du possible, cela devrait ressembler à une expression Python valide qui pourrait être utilisée pour recréer un objet avec la même valeur (dans un environnement approprié). Si ce n'est pas possible, une chaîne du formulaire <...some useful description...> doit être renvoyée. La valeur de retour doit être un objet chaîne. Si une classe définit __repr__() mais pas __str__(), alors __repr__() est également utilisée lorsqu'une représentation sous forme de chaîne "informelle" d'instances de cette classe est requise. Ceci est généralement utilisé pour le débogage, il est donc important que la représentation soit riche en informations et sans ambiguïté.

+0

De la documentation fournie dans la réponse, il semble que je n'ai pas besoin de __str__ définition si __repr__ est utilisé. Merci pour votre participation. – dvim

+1

@Blink_: Cela dépend de ce que vous voulez exactement. En utilisant la classe que j'ai définie, comparez la sortie de 'print Test()' avec 'print [Test()]'. –

9

La suggestion dans d'autres réponses à mettre en œuvre __repr__ est certainement une possibilité. Si c'est impossible pour une raison quelconque (type existant, __repr__ nécessaire pour des raisons autres que l'esthétique, etc.), puis juste faire

print [str(x) for x in l] 

ou, comme certains ne manqueront pas de suggérer, map(str, l) (juste un peu plus compact).

Questions connexes