126 votes

Python __str__ et listes

En Java, si j'ai de la Liste d'appels.toString(), il appelle automatiquement la méthode toString() de chaque objet à l'intérieur de la Liste. Par exemple, si ma liste contient les objets o1, o2 et o3, liste.toString() devrait ressembler à quelque chose comme ceci:

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"

Est-il possible d'obtenir un comportement similaire en Python? J'ai mis en place un __str__() dans ma classe, mais quand j'imprime une liste d'objets à l'aide de:

print 'my list is %s'%(list)

il ressemble à quelque chose comme ceci:

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]

comment puis-je obtenir python pour appeler mon __str__ automatiquement pour chaque élément à l'intérieur de la liste (ou dict que ce soit)?

158voto

David Berger Points 5459

L'appel de chaîne sur une liste python appelle la méthode __repr__ sur chaque élément à l'intérieur. Pour certains articles, __str__ et __repr__ sont identiques. Si vous voulez ce comportement, faites:

 def __str__(self):
    ...
def __repr__(self):
    return self.__str__()
 

27voto

Daniel Lew Points 39063

Vous pouvez utiliser une compréhension de liste pour générer une nouvelle liste avec chaque élément str () 'd automatiquement:

 print([str(item) for item in mylist])
 

8voto

S.Lott Points 207588

Deux choses faciles à faire, utilisez la fonction map ou utilisez une compréhension.

Mais cela vous donne une liste de chaînes, pas une chaîne. Donc, vous devez également joindre les chaînes ensemble.

 s= ",".join( map( str, myList ) )
 

ou

 s= ",".join( [ str(element) for element in myList ] )
 

Ensuite, vous pouvez imprimer cet objet chaîne composite.

 print 'my list is %s'%( s )
 

4voto

Horst Gutmann Points 3643

En fonction de l'utilisation souhaitée de cette sortie, peut-être que __repr__ serait plus approprié:

 import unittest

class A(object):
    def __init__(self, val):
        self.val = val

    def __repr__(self):
        return repr(self.val)

class Test(unittest.TestCase):
    def testMain(self):
        l = [A('a'), A('b')]
        self.assertEqual(repr(l), "['a', 'b']")

if __name__ == '__main__':
    unittest.main()
 

3voto

Jeremy Cantrell Points 7858

Je suis d'accord avec la réponse précédente sur l'utilisation de la compréhension de liste pour faire cela, mais vous pouvez certainement le cacher derrière une fonction, si c'est ce qui fait flotter votre bateau.

 def is_list(value):
    if type(value) in (list, tuple): return True
    return False

def list_str(value):
    if not is_list(value): return str(value)
    return [list_str(v) for v in value]
 

Juste pour le plaisir, j'ai fait list_str () récursivement str () de tout ce qui était contenu dans la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X