J'essaie de décaper un objet d'une classe I (nouveau style) définie. Mais je reçois l'erreur suivante:Pourquoi ai-je une erreur sur ma classe définissant __slots__ en essayant de décaper un objet?
>>> with open('temp/connection.pickle','w') as f:
... pickle.dump(c,f)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python2.5/pickle.py", line 1362, in dump
Pickler(file, protocol).dump(obj)
File "/usr/lib/python2.5/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.5/pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "/usr/lib/python2.5/pickle.py", line 419, in save_reduce
save(state)
File "/usr/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/usr/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/usr/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/usr/lib/python2.5/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.5/copy_reg.py", line 76, in _reduce_ex
raise TypeError("a class that defines __slots__ without "
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled
Je ne définissaient pas explicitement __slots__
dans ma classe. Est-ce que quelque chose que je fais implicitement le définir? Comment est-ce que je travaille autour de ceci? Ai-je besoin de définir __getstate__
?
Mise à jour:gnibbler a choisi un bon exemple. La classe de l'objet que j'essaie de décaper enveloppe une douille. (Il me semble maintenant que) les sockets définissent __slots__
et non __getstate__
pour une bonne raison. Je suppose qu'une fois qu'un processus se termine, un autre processus ne peut pas se décomposer et utiliser la connexion socket du processus précédent. Donc, alors que j'accepte l'excellente réponse de Alex Martelli, je vais devoir poursuivre une stratégie différente de celle du décapage pour «partager» la référence de l'objet.
Pouvez-vous montrer du code de la classe? Nous n'avons probablement pas besoin de voir * toutes * les méthodes. –