summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/glob.py12
-rw-r--r--Lib/pathlib/_abc.py91
-rw-r--r--Lib/pathlib/_local.py34
3 files changed, 47 insertions, 90 deletions
diff --git a/Lib/glob.py b/Lib/glob.py
index 6088de0..920f79a 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -340,7 +340,7 @@ class _Globber:
# Low-level methods
- lstat = operator.methodcaller('lstat')
+ lexists = operator.methodcaller('exists', follow_symlinks=False)
add_slash = operator.methodcaller('joinpath', '')
@staticmethod
@@ -516,12 +516,8 @@ class _Globber:
# Optimization: this path is already known to exist, e.g. because
# it was returned from os.scandir(), so we skip calling lstat().
yield path
- else:
- try:
- self.lstat(path)
- yield path
- except OSError:
- pass
+ elif self.lexists(path):
+ yield path
@classmethod
def walk(cls, root, top_down, on_error, follow_symlinks):
@@ -562,7 +558,7 @@ class _Globber:
class _StringGlobber(_Globber):
- lstat = staticmethod(os.lstat)
+ lexists = staticmethod(os.path.lexists)
scandir = staticmethod(os.scandir)
parse_entry = operator.attrgetter('path')
concat_path = operator.add
diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py
index 06c10e8..568a17d 100644
--- a/Lib/pathlib/_abc.py
+++ b/Lib/pathlib/_abc.py
@@ -13,32 +13,12 @@ resemble pathlib's PurePath and Path respectively.
import functools
from glob import _Globber, _no_recurse_symlinks
-from errno import ENOENT, ENOTDIR, EBADF, ELOOP, EINVAL
+from errno import ENOTDIR, ELOOP
from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO
__all__ = ["UnsupportedOperation"]
-#
-# Internals
-#
-
-_WINERROR_NOT_READY = 21 # drive exists but is not accessible
-_WINERROR_INVALID_NAME = 123 # fix for bpo-35306
-_WINERROR_CANT_RESOLVE_FILENAME = 1921 # broken symlink pointing to itself
-
-# EBADF - guard against macOS `stat` throwing EBADF
-_IGNORED_ERRNOS = (ENOENT, ENOTDIR, EBADF, ELOOP)
-
-_IGNORED_WINERRORS = (
- _WINERROR_NOT_READY,
- _WINERROR_INVALID_NAME,
- _WINERROR_CANT_RESOLVE_FILENAME)
-
-def _ignore_error(exception):
- return (getattr(exception, 'errno', None) in _IGNORED_ERRNOS or
- getattr(exception, 'winerror', None) in _IGNORED_WINERRORS)
-
@functools.cache
def _is_case_sensitive(parser):
@@ -450,12 +430,7 @@ class PathBase(PurePathBase):
"""
try:
self.stat(follow_symlinks=follow_symlinks)
- except OSError as e:
- if not _ignore_error(e):
- raise
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
return True
@@ -465,14 +440,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISDIR(self.stat(follow_symlinks=follow_symlinks).st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist or is a broken symlink
- # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ )
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def is_file(self, *, follow_symlinks=True):
@@ -482,14 +450,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISREG(self.stat(follow_symlinks=follow_symlinks).st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist or is a broken symlink
- # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ )
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def is_mount(self):
@@ -518,13 +479,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISLNK(self.lstat().st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def is_junction(self):
@@ -542,14 +497,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISBLK(self.stat().st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist or is a broken symlink
- # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ )
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def is_char_device(self):
@@ -558,14 +506,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISCHR(self.stat().st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist or is a broken symlink
- # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ )
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def is_fifo(self):
@@ -574,14 +515,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISFIFO(self.stat().st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist or is a broken symlink
- # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ )
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def is_socket(self):
@@ -590,14 +524,7 @@ class PathBase(PurePathBase):
"""
try:
return S_ISSOCK(self.stat().st_mode)
- except OSError as e:
- if not _ignore_error(e):
- raise
- # Path doesn't exist or is a broken symlink
- # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ )
- return False
- except ValueError:
- # Non-encodable path
+ except (OSError, ValueError):
return False
def samefile(self, other_path):
diff --git a/Lib/pathlib/_local.py b/Lib/pathlib/_local.py
index f2c6273..7dc0719 100644
--- a/Lib/pathlib/_local.py
+++ b/Lib/pathlib/_local.py
@@ -502,12 +502,46 @@ class Path(PathBase, PurePath):
"""
return os.stat(self, follow_symlinks=follow_symlinks)
+ def exists(self, *, follow_symlinks=True):
+ """
+ Whether this path exists.
+
+ This method normally follows symlinks; to check whether a symlink exists,
+ add the argument follow_symlinks=False.
+ """
+ if follow_symlinks:
+ return os.path.exists(self)
+ return os.path.lexists(self)
+
+ def is_dir(self, *, follow_symlinks=True):
+ """
+ Whether this path is a directory.
+ """
+ if follow_symlinks:
+ return os.path.isdir(self)
+ return PathBase.is_dir(self, follow_symlinks=follow_symlinks)
+
+ def is_file(self, *, follow_symlinks=True):
+ """
+ Whether this path is a regular file (also True for symlinks pointing
+ to regular files).
+ """
+ if follow_symlinks:
+ return os.path.isfile(self)
+ return PathBase.is_file(self, follow_symlinks=follow_symlinks)
+
def is_mount(self):
"""
Check if this path is a mount point
"""
return os.path.ismount(self)
+ def is_symlink(self):
+ """
+ Whether this path is a symbolic link.
+ """
+ return os.path.islink(self)
+
def is_junction(self):
"""
Whether this path is a junction.