Antoine Pitrou <pit...@free.fr> added the comment:

Le mardi 14 septembre 2010 à 23:19 +0000, Giampaolo Rodola' a écrit :
> I've never used socket.socket.makefile so I'm not sure, but its
> documentation says:
> 
> > The socket must be in blocking mode (it can not have a timeout).
> 
> If the statement is there because EAGAIN/EWOULDBLOCK were originally 
> raised then it should be removed, otherwise I question whether
> makefile() is actually supposed to support non-blocking sockets in 
> the first place.

If it wasn't supposed to, we can add that support.
The statement comes from the 2.x doc; 2.x didn't have a notion of non-blocking 
file-like objects at all, so it makes sense.

> IMO, I think it's a matter of figuring out whether makefile() should 
> provide a socket-like behavior or a file like-behavior first.

Well, since it claims to implement RawIOBase, it should provide a 
RawIOBase-like behaviour :)
(and, in any case, the only use of makefile() is to return something file-like. 
If you want socket-like behaviour, just use the socket)

Returning None is what raw I/O objects are supposed to do when they fail 
reading or writing even a single byte. It is designed and documented as such.

(the readinto() doc you mentioned lacked that precision, but I've just fixed it)

The reason None is returned (rather than 0 or b'') is so that the caller can 
recognize the situation and take appropriate measures.
For example, if read() returns None, it means some bytes *may* be following but 
we'll have to wait (select/poll/...) first; if read() returns 0, conversely, it 
means we've reached EOF (or, on a socket, that the peer has shutdown its side 
of the connection). These are two very different situations.

["file-like behaviour"]
> otherwise they should be
> silenced/handled internally or makefile() just fail immediately as
> there's not such thing as "non-blocking files".

Non-blocking files exist:

>>> import fcntl, os, io
>>> r, w = os.pipe()
>>> fcntl.fcntl(r, fcntl.F_SETFL, os.O_NONBLOCK)
0
>>> os.read(r, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 11] Resource temporarily unavailable

(It seems that on regular files O_NONBLOCK may not have an effect; not under 
Linux anyway)

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue9854>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to