[pyar] Serializando una lista de objetos con pickle problema en la impresión del archivo serializado

XLJ xlj xlj707 en gmail.com
Jue Mar 10 12:29:59 ART 2016


CONFIRMADO agregando __repr__ = __str__ al final de mi clase Ejemplar que es de la que hereda Libro todo quedo arreglado. es decir, al leer el archivo pickle presenta los datos perfectamente legibles y sin perdida!! MUCHAS GRACIAS  POR SU INVALUABLE APOYO!! 


> On Mar 10, 2016, at 7:15 AM, Mauro Caceres <mauro.caceres en gmail.com> wrote:
> 
> El objeto libros se esta des-serializando correctamente, y el print(libros) tambien es correcto, esto se debe a que el metodo __str__ de los containers (lista en tu caso) llama al __repr__ de los objetos contenidos en ella (libro en tu caso). Esto es asi para que lo que veas de la lista no sea ambiguo.
> 
> Las opciones son:
> 
> 1) definir __repr__ en la clase ejemplar, aca el objetivo tiene que ser que el string que retornes represente unicovamente al objeto, es lo que se usa en los debugers y vas a necesitar en caso de problemas. si __repr__ = __str__ es bueno suficiente, lo podes hacer. (no es lo que yo haria)
> 
> 2) en lugar de imprimir de hacer
> print(libros)
> podes hacer (con miles de variantes) 
> for libro in libros:
>     print(libro)
> 
> Saludos
> 
> 
> 2016-03-09 22:06 GMT-03:00 Ezequiel Trapani <etrapani04 en gmail.com <mailto:etrapani04 en gmail.com>>:
> Si, yo creo que esta bien definido (no tengo tanta experiencia en python). En este link, encontré la solución:
> 
> http://stackoverflow.com/questions/12448175/confused-about-str-in-python <http://stackoverflow.com/questions/12448175/confused-about-str-in-python>
> 
> Aparentemente el str funciona cuando quieres hacer print Libro, pero si vos querés mostrar una lista de libros, el método que llama de cada libro que contiene es __repr__. Este método es utilizado para hacer la representación oficial de un objeto( este link tiene bien la explicación --> http://satran.in/2012/03/14/python-repr-str.html <http://satran.in/2012/03/14/python-repr-str.html>). Por lo que entiendo se puede definir igual que el método __Str__ o como dice en el primer link sobreescribirlo de la siguiente forma al final de la definición de la clase:
> 
> __repr__ = __str__
> 
> De todas maneras es mi humilde opinion sin experiencia, puedo estar errado, no lo probe nunca me fio por lo que lei.
> 
> Saludos.
> 
> 
> 
> 2016-03-09 21:38 GMT-03:00 XLJ xlj <xlj707 en gmail.com <mailto:xlj707 en gmail.com>>:
> SI TENGO DEFINIDO EL METODO STR EN LA CLASE Ejemplar QUE ES LA CLASE DE LA CUAL HEREDA LA CLASE Libro 
> 
> 
> 
> mi clase Libro 
> 
> from clases.ejemplar import Ejemplar 
> 
> class Libro(Ejemplar): 
> 	def __init__(self, titulo, anio, autor, paginas, editorial, codigoLibro): 
> 		Ejemplar.__init__(self, titulo, anio, autor, paginas, editorial) #super
> 		self.__codigolibro = codigoLibro #atributo adicional propio de esta clase 
> 
> 	def getCodigoLibro(self): 
> 		return self.__codigolibro
> 
> 
> mi clase Ejemplar 
> 
> #clase ejemplar de la cual sera la clase padre 
> class Ejemplar: 
> 	def __init__(self, titulo, anio, autor, paginas, editorial): 
> 		self.__titulo = titulo
> 		self.__anio = anio
> 		self.__autor = autor
> 		self.__paginas = paginas 
> 		self.__editorial = editorial 
> 		
> 	def getTitulo(self):
> 		return self.__titulo
> 
> 	def getAnio(self): 
> 		return self.__anio
> 
> 	def getAutor(self): 
> 		return self.__autor
> 
> 	def getPaginas(self): 
> 		return self.__paginas
> 
> 	def getEditorial(self): 
> 		return self.__editorial
> 		
> 	def __str__(self): 
> 		cadena = self.__titulo+','+str(self.__anio)+','+self.__autor+','+str(self.__paginas)+','+self.__editorial
> 		return cadena
> 
> 	#def __str__(self):
> 	 # 	cadena = self.getTitulo() +","+ self.getAnio() +","+ self.getAutor() +","+ self.getPaginas() +","+ self.getEditorial()
> 				
> 	  # 	 return cadena
> 
> #ESTA BIEN ECHO MI METODO STRING O NO ? 
> 
> 
> 
> 
>> On Mar 9, 2016, at 6:34 PM, Ezequiel Trapani <etrapani04 en gmail.com <mailto:etrapani04 en gmail.com>> wrote:
>> 
>> A mi criterio efectivamente te deserializa y te genera objetos de tipo libro, lo que te falta es el metodo string de libro para q te muestre el contenido y no la dirección de memoria.
>> Cuando vos declaras un objeto de cualquier tipo en cualquier lenguaje se le asigna en tiempo de ejecución un espacio de memoria, si vos haces print de la clase temuestra la dirección,  lo que se hace se declara el metodo __str__(python) tostring (java) etc donde podes le definis como queres q te represente la clase en un string,  de esta forma podes mostrar el contenido de la clase libro en este caso.
>> 
>> Saludos
>> 
>> El mar 9, 2016 7:01 p.m., "XLJ xlj" <xlj707 en gmail.com <mailto:xlj707 en gmail.com>> escribió:
>> # en este modulo tendre la estanteria de libros (listas)
>> from clases.libro import Libro
>> import pickle 
>> # titulo, anio, autor, paginas, editorial, codigoLibro
>> 
>> 
>> 
>> # llenado de la estanteria
>> lib1 = Libro("Alicia en el pais de las maravillas", 1999, "lucson marz", 200, "MCgraw Hill", "AHSBCr31")
>> lib2 = Libro("Peter Pan", 1985, "J. M. Barrie", 206, "A Millennium Fulcrum Edition", "HALSDF232")
>> lib3 = Libro("Oliver tweest", 1855, "Charles Dikenson", 120, "Porrua", "ASDFAS235")
>> lib4 = Libro("La Odisea", 1530, "Homero", 950, "Porrua", "ASDFASDF323")
>> lib5 = Libro("La iliada ", 1532, "Homero", 1300, "Porrua", "ADSFASD9032")
>> lib6 = Libro("La hojarasca", 1960, "Gabriel Garcia Marquez", 180, "Editorial Latina", "ADF3235ASD")
>> 
>> libros = [lib1, lib2, lib3, lib4, lib5, lib6]  # 6 libros
>> 
>> # vaciado de la lista
>> def listarLibros():
>>     for object in libros:
>>     	print(object, "\n", object.getCodigoLibro() ) 
>>     menu()
>> 
>> def eliminarTitulo(): 
>> 	print("eliminar titulo")
>> 	menu() 
>> def agregarTitulo(): 
>> 	#para agregar un titulo primero creamos una nueva instancia de Libro 
>> 	#para esto pedimos cada uno de los atributos requeridos 
>> 	titulo = input("cual es el titulo: ")
>> 	anio = input("ingresa el anio: ")
>> 	autor = input("ingresa el autor: ")
>> 	paginas = input("cuantas pagias tiene el libro? ")
>> 	editorial = input("de que editorial es? ")
>> 	claveLibro = input("ingresa un codigo alfanumerico para el libro: ")
>> 
>> 
>> 	lib7 = Libro(titulo, anio, autor, paginas, editorial, claveLibro)
>> 	libros.append(lib7)
>> 	#ahora convertimos el objeto python en JSON 
>> 	
>> 	
>> 	print("libro agregado con exito!! ")
>> 
>> 	menu()
>> 
>> def guardarCambiosEnArchivoPickle(): 
>> 
>> 	print("realizando serializacion pickle.......")
>> 	with open('libros.pickle','wb') as f: 
>> 		pickle.dump(libros, f,protocolo=0,import=True*)
>> 	print("cambios guardados con exito !")
>> 
>> 	menu()
>> 
>> def leerArchivoPickle(): 
>> 	with open('libros.pickle','rb') as f: 
>> 		libros = pickle.load(f,import=True*,encoding="ASCII"*,error="strict"*)
>> 		print(libros) 
>> 		print("\n")
>> 
>> 	menu()
>> 
>> def salir(): 
>> 	print("salir.....")
>> 
>> 
>> def menu(): 
>> 	opcion = input("Operaciones: \n\t 1) listar material \n\t 2) eliminar Titulo \n\t 3) agregar titulo \n\t 4) guardar Cambios En Archivo Pickle \n\t 5) leer archivo pickle \n\t 6) salir ")#todos los metodos manipularan archivos 
>> 	#emulamos switch 
>> 	operaciones = {'1':listarLibros, '2':eliminarTitulo, '3':agregarTitulo, '4':guardarCambiosEnArchivoPickle, '5':leerArchivoPickle, '6':salir}
>> 
>> 	operaciones[opcion]()
>> 
>> 
>> 
>> 
>>     
>> menu()
>> 
>> EL PROBLEMA ES QUE DESPUES DE SERIALIZAR EL CONTENIDO QUE LEEO CON LA FUNCION leerArchivoPickle()  es el siguiente: 
>> 
>> [<clases.libro.Libro object at 0x10118a320>, <clases.libro.Libro object at 0x10118a358>, <clases.libro.Libro object at 0x10118a1d0>, <clases.libro.Libro object at 0x10118a240>, <clases.libro.Libro object at 0x10118a2b0>, <clases.libro.Libro object at 0x101194c88>]
>> 
>> 
>> ES DECIR NO APARECE EN UN FORMATO LEGIBLE PARA EL SER HUMANO CADA UNO DE LOS OBJETOS 
>> ALGUIEN ME PUEDE DECIR A QUE SE DEBE ESTO Y COMO LO PUEDO CORREGIR? DE ANTEMANO GRACIAS POR SU APOYO Y COMPRESION 
>> 
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
>> 
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
>> 
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
>> 
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
>> 
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
> 
> _______________________________________________
> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
> 
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
> 
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
> 
> 
> 
> -- 
> Ezequiel Trapani
> 
> _______________________________________________
> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
> 
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
> 
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
> 
> 
> 
> -- 
> Mauro Cáceres
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
> 
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> 
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160310/75847227/attachment-0001.html>


Más información sobre la lista de distribución pyar