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

Mauro Caceres mauro.caceres en gmail.com
Jue Mar 10 10:15:55 ART 2016


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>:

> 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
>
> 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). 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>:
>
>> 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>
>> 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> 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
>>> 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
>>>
>> _______________________________________________
>> 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
>>
>>
>>
>> _______________________________________________
>> 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
>>
>
>
>
> --
> Ezequiel Trapani
>
> _______________________________________________
> 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
>



-- 
Mauro Cáceres
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160310/6b3a37d5/attachment.html>


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