On Wed, Dec 05, 2012 at 12:04:54AM +0100, Simone Ziraldo wrote:
> Ciao a tutti,
> 
> il problema che ho è questo: quando faccio il pickle di una classe derivata 
> di numpy.ndarray non mi salva gli attributi che ho definito io.
> Un codice semplice che genera questo problema è questo:
> 
> import pickle
> import numpy
> 
> class prova( numpy.ndarray ):
>     def __new__(cls,size):
>         return numpy.ndarray.__new__( cls, size )
>     def __init__(self,size ):
>         self.__size__ = size
> 
> s = prova(2)
> 
> f = open("prova.out", 'w')
> pickle.dump(s,f)
> f.close()
> 
> f = open("prova.out", 'r')
> obj = pickle.load(f)
> f.close
> 
> print obj.__size__
> 
> e mi viene restituito questo errore:
> AttributeError: 'prova' object has no attribute '__size__'

        >>> class prova2(numpy.ndarray):
        ...  def __init__(self, size):
        ...   numpy.ndarray.__init__(self, size)
        ...   self.__size__ = size
        ...  def __reduce__(self):
        ...   t = numpy.ndarray.__reduce__(self)
        ...   klass, args = t[:2]
        ...   func, args = t[:2]
        ...   return (reconstruct, (func, args, self.__size__)) + t[2:]
        ...
        >>> def reconstruct(f, args, size):
        ...  o = f(*args)
        ...  o.__size__ = size
        ...  return o
        ...
        >>> p3 = pickle.loads(pickle.dumps(p2))
        >>> p3
        prova2([  6.90286283e-310,   6.90286283e-310,   1.58101007e-322])
        >>> p3.__dict__
        {'__size__': 3}
        >>> 

la documentazione su pickle spiega tutto

ciao
m.
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a