classification
Title: pathlib: Path.exists broken
Type: behavior Stage: resolved
Components: Versions: Python 3.5, Python 3.4
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: georg.brandl, h.venev, pitrou, python-dev
Priority: normal Keywords: patch

Created on 2014-10-29 15:30 by h.venev, last changed 2014-10-30 22:16 by pitrou. This issue is now closed.

Files
File name Uploaded Description Edit
py.patch h.venev, 2014-10-29 15:30
path_exists_enotdir.patch pitrou, 2014-10-30 19:30
path_exists_enotdir2.patch pitrou, 2014-10-30 19:40
Messages (11)
msg230214 - (view) Author: Hristo Venev (h.venev) * Date: 2014-10-29 15:30
$ touch a
c: stat("a/x", ...) -> errno=ENOTDIR
$ python
>>> pathlib.Path('a/x').exists()

This should return False and not throw an exception.

Patch not tested.
msg230221 - (view) Author: Hristo Venev (h.venev) * Date: 2014-10-29 15:55
Tested and works.
msg230222 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2014-10-29 16:00
os.path.exists() ignores *all* OSErrors from stat.  This is probably too broad, but only ignoring ENOENT is probably too narrow.
msg230225 - (view) Author: Hristo Venev (h.venev) * Date: 2014-10-29 16:13
ENAMETOOLONG and possibly ELOOP should also return False.
EACCES, EOVERFLOW and ENOMEM should probably be forwarded.
EFAULT should not happen.
msg230292 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2014-10-30 19:25
ENAMETOOLONG: that doesn't mean the file doesn't exist. For example, it could be accessed by changing the current directory and shortening the residual path name.

ELOOP: unfortunately it doesn't guarantee that there is a real symlink loop, just that the OS decided to bail out after a certain number of indirections.

So in both cases I think we should let the errors bubble up.
msg230293 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2014-10-30 19:30
Here is a patch with tests.
msg230294 - (view) Author: Hristo Venev (h.venev) * Date: 2014-10-30 19:36
Should I file bugs for is_dir, is_file, is_symlink, is_socket, is_fifo, is_block_device and is_char_device?
msg230295 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2014-10-30 19:37
Le 30/10/2014 20:36, Hristo Venev a écrit :
> 
> Hristo Venev added the comment:
> 
> Should I file bugs for is_dir, is_file, is_symlink, is_socket, is_fifo, is_block_device and is_char_device?

Hmm... good catch. No, this issue will do.
msg230297 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2014-10-30 19:40
Updated patch for other querying function.
msg230303 - (view) Author: Roundup Robot (python-dev) Date: 2014-10-30 22:15
New changeset 40497cc445f4 by Antoine Pitrou in branch '3.4':
Issue #22759: Query methods on pathlib.Path() (exists(), is_dir(), etc.) now return False when the underlying stat call raises NotADirectoryError.
https://hg.python.org/cpython/rev/40497cc445f4

New changeset ff5f5fd230d3 by Antoine Pitrou in branch 'default':
Issue #22759: Query methods on pathlib.Path() (exists(), is_dir(), etc.) now return False when the underlying stat call raises NotADirectoryError.
https://hg.python.org/cpython/rev/ff5f5fd230d3
msg230304 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2014-10-30 22:16
This is now fixed. Thanks for the report!
History
Date User Action Args
2014-10-30 22:16:28pitrousetstatus: open -> closed
resolution: fixed
messages: + msg230304

stage: patch review -> resolved
2014-10-30 22:15:42python-devsetnosy: + python-dev
messages: + msg230303
2014-10-30 19:40:37pitrousetfiles: + path_exists_enotdir2.patch

messages: + msg230297
2014-10-30 19:37:34pitrousetmessages: + msg230295
2014-10-30 19:36:53h.venevsetmessages: + msg230294
2014-10-30 19:30:55pitrousetfiles: + path_exists_enotdir.patch

messages: + msg230293
stage: test needed -> patch review
2014-10-30 19:25:55pitrousetmessages: + msg230292
2014-10-29 16:13:34h.venevsetmessages: + msg230225
2014-10-29 16:00:23georg.brandlsetnosy: + georg.brandl
messages: + msg230222
2014-10-29 15:58:17pitrousetnosy: + pitrou
stage: test needed
type: behavior

versions: + Python 3.4, Python 3.5
2014-10-29 15:55:08h.venevsetmessages: + msg230221
2014-10-29 15:30:32h.venevcreate