[EMAIL PROTECTED] wrote: > socket objects have a little quirk. If you try to receive 0 bytes on a > blocking socket, they block. That is, if I call recv(0), it blocks > (until some data arrives). > Well, arguably you should just try to stop receiving zero bytes. Why on earth is your application doing this?
> I think that's wrong, but I don't want to argue that. I would like to > create a subclass of socket that fixes the problem. Ideally, something > like: > > class new_socket(socket): > def recv( self, bufsize, flags=0 ): > if bufsize == 0: > return "" > else: > return socket.recv( bufsize, flags ) > That would indeed work, were it not for the complications you are about to relate. > They only problem is, sockets return socket objects via the accept > call. And the socket returned is of type socket, of course, not > new_socket, as I would like. I could override accept() to return a > new_socket, but I don't know how to convert the old socket to a new > socket. That is, I'd like to add a method to the class above something > like: > > def accept( self ): > conn, addr = socket.accept() > <convert conn, which is type socket to type new_socket> > return ( conn, addr ) > > Does anyone have any suggestions on how to do the above? > You could use the "delegation" pattern - return an object that contains a reference to the socket returned by accept(), and have that object implement recv() as you outline above, and __getattr__() so that any methods your socket *doesn't* implement are instead called on the socket returned by accept(). There's a whole page of stuff at http://aspn.activestate.com/ASPN/search?query=delegation&x=0&y=0&type=ASPN but the best read will probably be http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52295 In that article Alex talks about how old-style classes can't inherit from basic Python types. This is out of date now for most types, but his exposition of the principles of delegation remains a beacon of clarity. regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC www.holdenweb.com PyCon TX 2006 www.python.org/pycon/ -- http://mail.python.org/mailman/listinfo/python-list