Question

Je travaille sur un projet construit sur Python 2.4 (Il est un projet python intégré, donc je n'ai pas le choix de la version de python utilisé). Tout au long de l'application, nous utilisons array.array pour stocker des données.

Support pour objets array.array de décapage a été ajouté à pickle (et cPickle) à 2,5. Nous avons une solution viable à 2.4 lors de l'utilisation de la classe de conserves au vinaigre pur python (nous sous Pickler / Unpickler pour gérer les tableaux), mais cela ne fonctionne pas avec cPickle (nous avons besoin de ce en raison de problèmes de performance).

Toutes les suggestions?

EDIT - SOLUTION:

Ceci est le code final qui semble fonctionner (merci pour les suggestions):

# 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)
Était-ce utile?

La solution

Vous pouvez utiliser le module bibliothèque standard copy_reg pour enregistrer des fonctions pour traiter les cas de décapage des types qui ne supportent pas nativement le décapage; cPickle utilisera vos fonctions enregistrées en cas de besoin. J'applique exactement cette approche « crochet » à votre exigence de cas de décapage de array.array.

Autres conseils

Je ne sais pas si le type de réseau peut être augmentée avec une méthode de __reduce__ (peut-être avec une sous-classe), mais vous pouvez toujours essayer de convertir vos tableaux de séquences et de retour à nouveau ... si le mécanisme d'extension intégré gagné « t travailler pour vous. (Bidouille)

Je ne l'ai pas essayé cela avant, mais vous pouvez essayer d'ajouter un soutien via copy_reg ... essentiellement le même résultat que la mise en œuvre __reduce__ sur votre propre classe ou sous-classe, mais un nettoyant peu.

On dirait que vous pouvez les conserves au vinaigre, mais vous ne pouvez pas le résultat unpickle

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)

REGARDENT les décharges ne comprend même pas d'informations sur l'typecode..or même les données: (

>>> a=array.array('c','abcdefghijkl') 
>>> pickle.dumps(a,2)                                                                                                                                                                             
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top