[Python-Dev] Iterable sockets?

Alex Martelli aleax@aleax.it
Fri, 14 Mar 2003 08:44:12 +0100

On Friday 14 March 2003 02:47 am, Andrew McNamara wrote:
> Line oriented network protocols are very common, and I often find myself
> calling the socket makefile method so I can read complete lines from a
> socket. I'm probably not the first one who's wished that socket objects
> where more file-like.
> While I don't think we'd want to go as far as to turn them into a stdio
> based file object, it might make sense to allow them to be iterated over
> (and add a .readline() method, I guess). This would necessitate adding some
> input buffering, which will complicate things like the .recv() method, so
> I'm not sure it's that good an idea, but it removes one gotchya for
> neophytes (and forgetful veterans). Thoughts?

I've had occasion to code a "socket that turns into a filelike object at
need" (back in Python 2.0, I believe) and I used something like (can't
find the original code, but AFAIR it was a bit like the following):

class richsocket:

    def __init__(self, sock, *args):

        self.sock = socket.socket(*args)
        self.file = None

    def __getattr__(self, name):

        try: result = getattr(self.sock, name)
        except AttributeError: pass
        else: return result

        if self.file is None: self.file = self.sock.makefile()
        return getattr(self.file, name)

This has some issues (e.g. method close goes to self.sock when it
should probably go to self.file if not None; plus, the buffering issues
you mention, etc), but nothing that looks too hard to fix -- in my use
case I applied AGNI and never needed any more than this simple
and smooth "double alternate delegation" pattern.  Today, if type
socket supports inheritance (haven't checked), it should be even 
easier, I suspect.