pickle problem

Hrvoje Niksic hniksic at xemacs.org
Thu May 8 17:35:04 EDT 2008


Marc 'BlackJack' Rintsch <bj_666 at gmx.net> writes:

> On Thu, 08 May 2008 08:55:35 -0700, krustymonkey wrote:
>
>> The thing is, I'm not using slots by choice.  I'm using the standard
>> lib "socket" class, which apparently uses slots.
>
> `socket` objects can't be pickled.  Not just because of the
> `__slot__`\s but because a substantial part of their state lives in
> the operating system's space.

Of course, if it makes sense to pickle sockets in the application, one
is can do so by defining __getstate__ and __setstate__:

class Connection(object):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.init_sock()

    def init_sock(self):
        self.sock = socket.socket()
        self.sock.connect((host, port))
        ... init communication ...

    def __getstate__(self):
        # pickle self as a (host, port) pair
        return self.host, self.port

    def __setstate__(self, state):
        # reinstate self by setting host and port and
        # recreating the socket
        self.host, self.port = state
        self.init_sock()



More information about the Python-list mailing list