Decapado array.array en 2,4 usando cPickle
-
22-09-2019 - |
Pregunta
Estoy trabajando en un proyecto construido en Python 2.4 (que es un proyecto de Python incrustado, por lo que no tengo elección de la versión de Python se utiliza). A lo largo de la aplicación, utilizamos array.array
para almacenar datos.
Soporte para el decapado de objetos array.array
se añadió a pickle
(y cPickle
) en 2,5. Tenemos una solución viable en 2.4 cuando se utiliza la clase pitón salmuera pura (que subclase Pickler / Unpickler a las matrices de mango), pero esto no funciona con cPickle (necesitamos esto debido a problemas de rendimiento).
¿Alguna sugerencia?
Editar - SOLUCIÓN:
Este es el código final que parece estar funcionando (gracias por las sugerencias):
# Add serialization for array objects
def array_unpickler(data):
return array.array(data[0], data[1:])
def array_pickler(arr):
return array_unpickler, ("%s%s" % (arr.typecode, arr.tostring()),)
copy_reg.pickle(array.ArrayType, array_pickler, array_unpickler)
Solución
Se puede usar la biblioteca estándar de módulo copy_reg para registrar funciones para hacer frente a decapado instancias de tipos que no son compatibles de forma nativa decapado; cPickle
utilizará sus funciones registradas cuando sea necesario. Me aplico exactamente este enfoque "gancho" a su requerimiento de decapado casos de array.array
.
Otros consejos
No estoy seguro de si el tipo de matriz se puede aumentar con un método __reduce__
(tal vez con una subclase), pero siempre se podría tratar de convertir las matrices de secuencias y de nuevo ... si la incorporada en el mecanismo de extensión de won 't trabajo para usted. (Corte)
No he intentado esto antes, pero se puede tratar de añadir soporte a través de copy_reg ... esencialmente el mismo resultado que la aplicación de __reduce__
en su propia clase o subclase, pero un poco más limpio.
parece que se puede conservar en vinagre, pero no se puede unpickle el resultado
Python 2.4.5 (#2, Jan 21 2010, 20:05:55)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cPickle as pickle
>>> import array
>>> a=array.array('i','12345678')
>>> pickle.dumps(a,2)
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> b=pickle.loads(_)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: array() takes at least 1 argument (0 given)
Mira los los vertederos ni siquiera incluye información sobre el typecode..or incluso los datos: (
>>> a=array.array('c','abcdefghijkl')
>>> pickle.dumps(a,2)
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>>