pickle problem

Diez B. Roggisch deets at nospam.web.de
Thu May 8 06:48:39 EDT 2008


krustymonkey at gmail.com wrote:

> I'm wondering if anyone can help with a workaround for a problem I
> currently have.  I'm trying to set up a prefork tcp server.
> Specifically, I'm setting up a server that forks children and has them
> listen on pipes created with os.pipe().  The parent process for the
> group starts an inet:tcp server on a given port.  In the parent, after
> a "socket.accept()", I'm trying to pickle the connection object to
> send over an IPC pipe (as stated previously), but I get the following
> error:
> 
> File "/usr/lib/python2.4/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
> 
> Does anyone know of a workaround for this?  Maybe my approach to this
> is wrong?  Any help would be appreciated.

The error-message is pretty clear I'd say. You use slots - so you are
responsible yourself for implementing the pickling-protocol using
__getstate__ and __setstate__. Looking at the pickle-docs should give you
an idea.

But the really easy solution is: do not use slots. They are intended as
memory-consumption optimization technique, *not* as "I want to declare my
attributes explicitly"-mechanism. So - get rid of them and be a happy
pickler.

Diez



More information about the Python-list mailing list