2010-02-25 4 views
2

Je travaille sur un projet construit sur python 2.4 (C'est un projet python embarqué, donc je n'ai pas le choix sur la version de python utilisée). Tout au long de l'application, nous utilisons array.array pour stocker des données.Décapage array.array en 2.4 en utilisant cPickle

La prise en charge du décapage array.array objets a été ajoutée à pickle (et cPickle) dans 2.5. Nous avons une solution de contournement viable dans 2.4 en utilisant la pure classe pickle python (nous sous-traitons Pickler/Unpickler pour gérer les tableaux) mais cela ne fonctionne pas avec cPickle (nous avons besoin de cela en raison de problèmes de performance).

Des suggestions?

EDIT - SOLUTION:

Voici 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) 

Répondre

2

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

+0

Excellent! Je l'ai fait fonctionner. Votre suggestion m'a conduit à http://effbot.org/librarybook/copy-reg.htm, qui fournit quelques excellents exemples. –

1

Je ne suis pas sûr si le type de tableau peut être augmenté avec une méthode __reduce__ (peut-être avec une sous-classe), mais vous pouvez toujours essayer de convertir vos tableaux en séquences & de retour ... si le mécanisme d'extension intégré ne fonctionne pas pour vous. (hack)

Je n'ai pas essayé cela auparavant, mais vous pouvez essayer d'ajouter le support via copy_reg ... essentiellement le même résultat que l'implémentation __reduce__ sur votre propre classe ou sous-classe, mais un peu plus propre.

+0

Pour les tableaux je voudrais les convertir en un grand objet chaîne avec '.tostring()', qui est juste une copie des octets en mémoire représentant le tableau –

+0

Avec cette approche, vous voudriez également inclure le type de code du tableau J'ai essayé ça approche mais je rencontre des problèmes pour obtenir l'état du code de type dans l'objet non pillé. J'ai essayé de comprendre «__initargs__» à peu de chose ... Je pense que je vais adopter l'approche 'copy_req'. –

1

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

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 la typecode..or même les données :(

>>> a=array.array('c','abcdefghijkl') 
>>> pickle.dumps(a,2)                                            
'\x80\x02carray\narray\nq\x01)\x81q\x02.' 
>>> 
+0

Oui, cela semble confirmer ce bug de la liste de diffusion python: http://mail.python.org/pipermail/python-bugs-list/2006-January/031597.html Les "smarts" ont été ajoutés en 2.5 –

Questions connexes