2010-08-24 31 views
18

Bueno este fragmento consola Python interactiva dirá todo:Cómo aplicar __str__ función cuando se imprime una lista de objetos 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] 

Básicamente me gustaría conseguir tres asd cadena impreso al imprimir la lista. También probé pprint pero da los mismos resultados.

Respuesta

3

Es necesario hacer un método __repr__:

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


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

Consulte la docs:

object.__repr__(self)

Llamado por la función incorporada repr() y por conversiones de cadena (comillas inversas) para calcular la representación de cadena "oficial" de un objeto. Si es posible, debería parecer una expresión de Python válida que podría usarse para recrear un objeto con el mismo valor (dado un entorno apropiado). Si esto no es posible, se debe devolver una cadena del formulario <...some useful description...>. El valor de retorno debe ser un objeto de cadena. Si una clase define __repr__() pero no __str__(), entonces __repr__() también se usa cuando se requiere una representación de serie "informal" de instancias de esa clase.

Esto se suele utilizar para la depuración, por lo que es importante que la representación sea rica en información y no ambigua.

+0

Según la documentación provista en la respuesta, parece que no necesito la definición __str__ si se usa __repr__. Gracias por su aporte. – dvim

+1

@Blink_: depende de qué es exactamente lo que quiere. Utilizando la clase que he definido, compare la salida de 'print Test()' contra 'print [Test()]'. –

9

La sugerencia en otras respuestas para implementar __repr__ es definitivamente una posibilidad. Si eso es inviable por cualquier razón (tipo existente, __repr__ sea necesario por razones distintas de estética, etc.), a continuación, sólo hacer

print [str(x) for x in l] 

o, como algunos están seguros de sugerir, map(str, l) (sólo un poco más compacto).

Cuestiones relacionadas