Eryk Sun <eryk...@gmail.com> added the comment:

> Maybe os.fspath() can be used

I think that would already be the case if genericpath.exists didn't have to 
support file descriptors. It's documented that the path argument "refers to an 
existing path or an open file descriptor".

Modifying _fd_converter would provide consistent behavior for all calls that 
ultimately use argument clinic's path_t(allow_fd=True) and/or dir_fd. Serhiy's 
suggestion to raise a warning sounds good. 

Here are some examples that currently pass silently in Linux:

    >>> os.chown(False, 1000, 1000)
    >>> os.chmod(False, 0o666)
    >>> os.utime(False, (1500000000, 1500000000))

Probably os.fstat and other "f" functions (e.g. fstatvfs, fchdir, fchown, 
fchmod, ftruncate, fdatasync, fsync, and fpathconf) should also raise a warning 
when passed a bool. For example, the following would raise a warning instead of 
passing silently:

    >>> os.fstat(False).st_size
    0

These cases could be addressed by consistently using an argument clinic type. 
Some of them already us the fildes type (e.g. fchdir, fsync, fdatasync). 
However, fildes_converter calls PyObject_AsFileDescriptor, which also supports 
objects with a fileno() method. That's documented behavior for 
PyObject_AsFileDescriptor, but nothing in the documentation of fchdir, fsync, 
and fdatasync suggests to me that they support objects with a fileno() method:

    >>> os.fchdir(sys.stdin)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NotADirectoryError: [Errno 20] Not a directory

If not for this behavior, we could simply change all of the "f" functions to 
use the fildes type.

PyObject_AsFileDescriptor is used in various other places as well, such as the 
select module. In the latter case, supporting objects with a fileno() method is 
clearly documented.

Also consider including open() and os.fdopen by modifying _io_open_impl in 
Modules/_io/_iomodule.c. For example:

   >>> open(False, closefd=False)
    <_io.TextIOWrapper name=False mode='r' encoding='UTF-8'>

Currently it calls PyNumber_Check(file). If true, a warning could be raised if 
PyBool_Check(file) is also true.

----------

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

Reply via email to