En Java, si llamo a List.toString (), llamará automáticamente al método toString () en cada objeto dentro de la Lista. Por ejemplo, si mi lista contiene objetos o1, o2 y o3, list.toString () se vería así:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
¿Hay alguna forma de obtener un comportamiento similar en Python? Implementé un método __str __ () en mi clase, pero cuando imprimo una lista de objetos, uso:
print 'my list is %s'%(list)
se parece a esto:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
¿Cómo puedo hacer que Python llame a mi __str__ automáticamente para cada elemento dentro de la lista (o dict para el caso)?
Respuestas:
Llamar a una cadena en una lista de Python llama al
__repr__
método en cada elemento dentro. Para algunos artículos,__str__
y__repr__
son los mismos. Si desea ese comportamiento, haga:fuente
__str__
con__repr__
generalmente no está de acuerdo con el modelo de datos de Python , por lo que la solución de comprensión de listas propuesta por @ daniel-lew es más pitónica.str()
devolviera en una listastr()
para cada uno de los elementos individuales dentro.Puede usar una lista de comprensión para generar una nueva lista con cada elemento str () 'd automáticamente:
fuente
print(map(str, mylist))
, es un poco más cortoDos cosas fáciles que puede hacer, usar la
map
función o usar una comprensión.Pero eso le da una lista de cadenas, no una cadena. Así que también tienes que unir los hilos.
o
Entonces puede imprimir este objeto de cadena compuesta.
fuente
Dependiendo de para qué quieras usar esa salida, quizás
__repr__
sea más apropiado:fuente
Estoy de acuerdo con la respuesta anterior sobre el uso de listas por comprensión para hacer esto, pero ciertamente podría ocultar eso detrás de una función, si eso es lo que hace flotar su bote.
Solo por diversión, hice list_str () recursivamente str () todo lo contenido en la lista.
fuente
__str__
y por__repr__
separado¿Algo como esto?
fuente
Esto debería ser suficiente.
Al imprimir listas, así como otras clases de contenedor, los elementos contenidos se imprimirán usando
__repr__
, porque__repr__
está destinado a ser utilizado para la representación de objetos internos. Si llamamos:help(object.__repr__)
nos dirá:Y si lo llamamos
help(repr)
, saldrá:Si
__str__
está implementado para un objeto y__repr__
no,repr(obj)
generará la salida predeterminada, al igual queprint(obj)
cuando no se implementa ninguno de estos.Entonces, la única forma es implementarlo
__repr__
para su clase. Una posible forma de hacerlo es esta:fuente
La salida que está obteniendo es solo el nombre del módulo del objeto, el nombre de la clase y luego la dirección de memoria en hexadecimal, ya que la
__repr__
función no se anula.__str__
se usa para la representación de cadena de un objeto cuando se usa print. Pero como está imprimiendo una lista de objetos y no iterando sobre la lista para llamar alstr
método para cada elemento, imprime la representación de los objetos.Para
__str__
invocar la función, debe hacer algo como esto:Si anula la
__repr__
función, puede usar el método de impresión como lo hacía antes:Entonces obtendrá "
my list is [1, 2, 3]
" como salida.fuente