[Python-Dev] error in doc for fcntl module (original) (raw)

Mike Coleman tutufan at gmail.com
Thu Jan 8 18:05:07 CET 2009


One problem is that API wrappers like this sometimes include extra functionality. When I ran across this example, I wondered whether the Python interface had been enhanced to work like this

# set these three flags
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_APPEND)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NOATIME)

Something like this might be nice, but after staring at it for another minute, I realized that the Python interface itself was standard, and that it was the example itself that was confusing me. (I've been programming Unix/POSIX for over 20 years, so perhaps I simply outsmarted myself, or am an idiot. Still, I found it confusing.)

One of the many virtues of Python is that it's oriented towards learning/teaching. It seems like it would be useful in this case to have an example that shows best practice (as in Stevens/Rago and other similar texts), rather than one that will merely usually work on present systems.

If it makes any difference, I'd be happy to send a patch. Is there any reason not to change this?

Mike

On Wed, Jan 7, 2009 at 6:36 PM, Guido van Rossum <guido at python.org> wrote:

Well my Linux man page says that the only flags supported are OAPPEND, OASYNC, ODIRECT, ONOATIME, and ONONBLOCK; and all of those are typically off -- so I'm not sure that it's a mistake or need correcting. These APIs should only be used by people who know what they're doing anyways; the examples are meant to briefly show the call format.

On Wed, Jan 7, 2009 at 1:31 PM, Mike Coleman <tutufan at gmail.com> wrote: In the doc page for the fcntl module, the example below is given. This seems like an error, or at least very misleading, as the normal usage is to get the flags (FGETFL), set or unset the bits you want to change, then set the flags (FSETFL). A reader might think that the example below merely sets ONDELAY, but it also stomps all of the other bits to zero.

If someone can confirm my thinking, this ought to be changed. import struct, fcntl, os f = open(...) rv = fcntl.fcntl(f, fcntl.FSETFL, os.ONDELAY) -- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list