[Python-Dev] Fuzziness in io module specs

MRAB python at mrabarnett.plus.com
Fri Sep 18 21:55:00 CEST 2009


[Oops! Hit Send to soon]

Pascal Chambon wrote:
> Hello everyone
> 
> I'm currently working on a reimplementation of io.FileIO, which would 
> allow cross-platform file range locking and all kinds of other safety 
> features ; however I'm slightly stuck due to some specification 
> fuzziness in the IO docs.
> CF     http://bugs.python.org/issue6939
> 
> The main points that annoy me at the moment :
> - it is unclear what truncate() methods do with the file pointer, and 
> even if the current implementation simply moves it to the truncation 
> point, it's very contrary to the standard way of doing under unix, where 
> the file pointer is normally left unchanged. Shouldn't we specify that 
> the file pointer remains unmoved, and fix the _fileio module accordingly ?

I think that this should be an invariant:

     0 <= file pointer <= file size

so the file pointer might sometimes have to be moved.

> - exceptions are not always specified, and even if most of them are 
> IOErrors, weirdly, in some cases, an OSError is raised instead (ie, if 
> we try to wrap a wrong file descriptor when instanciating a new FileIO). 
> This might lead to bad program crashes if some people don't "refuse the 
> temptation to guess" and only get prepared to catch IOErrors
> - the doc sometimes says that when we receive an empty string from a 
> read() operation, without exceptions, it means the file is empty. 
> However, with the current implementation, if we call file.read(0), we 
> simply receive "", even though it doesn't mean that we're at EOF. 
> Shouldn't we avoid this (rare, I admit) ambiguity on the return value, 
> by preventing read(0) ? Or at least, note in the doc that (we receive an 
> empty string) <-> (the file is at EOF OR we called read with 0 as 
> parameter) ?
> 
If you ask for 0 bytes then you get 0 bytes.

> Are there some arguments that I don't know, which lead to this or that 
> particular implementation choice ?
> I'd strongly advocate very detailled specifications, letting no room for 
> cross-platform subtilities (that's also a strong goal of my 
> reimplemntation), since that new IO system (which saved me a lot of 
> coding time, by the way) should become the base of many programs.
> 
> So wouldn't it be a godo idea to write some kind of mini-pep, just to 
> fix the corner cases of the current IO documentation ? I might handle 
> it, if no more-knowledgeable people feels like it.
> 
As for the question of whether 'truncate' should be able to lengthen a
file, the method name suggests no; if the method name were 'resize', for
example, then maybe yes, zeroing the new bytes for security.


More information about the Python-Dev mailing list