https://github.com/python/cpython/commit/48c84a400aa90014a16ceac92df4b0cf5ca6b3d4
commit: 48c84a400aa90014a16ceac92df4b0cf5ca6b3d4
branch: main
author: Barney Gale <[email protected]>
committer: barneygale <[email protected]>
date: 2025-02-24T19:07:54Z
summary:
GH-125413: pathlib ABCs: use caching `path.info.exists()` when globbing
(#130422)
Call `ReadablePath.info.exists()` rather than `ReadablePath.exists()` when
globbing so that we use (or populate) the `info` cache.
files:
M Lib/glob.py
M Lib/pathlib/_abc.py
M Lib/test/test_pathlib/test_pathlib_abc.py
diff --git a/Lib/glob.py b/Lib/glob.py
index cd8859e63318f3..d1a6dddeeb1610 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -533,7 +533,9 @@ class _PathGlobber(_GlobberBase):
"""Provides shell-style pattern matching and globbing for pathlib paths.
"""
- lexists = operator.methodcaller('exists', follow_symlinks=False)
+ @staticmethod
+ def lexists(path):
+ return path.info.exists(follow_symlinks=False)
@staticmethod
def scandir(path):
diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py
index 115e120572d9f1..4106d478822084 100644
--- a/Lib/pathlib/_abc.py
+++ b/Lib/pathlib/_abc.py
@@ -316,14 +316,11 @@ def walk(self, top_down=True, on_error=None,
follow_symlinks=False):
paths.append((path, dirnames, filenames))
try:
for child in path.iterdir():
- try:
- if child.info.is_dir(follow_symlinks=follow_symlinks):
- if not top_down:
- paths.append(child)
- dirnames.append(child.name)
- else:
- filenames.append(child.name)
- except OSError:
+ if child.info.is_dir(follow_symlinks=follow_symlinks):
+ if not top_down:
+ paths.append(child)
+ dirnames.append(child.name)
+ else:
filenames.append(child.name)
except OSError as error:
if on_error is not None:
diff --git a/Lib/test/test_pathlib/test_pathlib_abc.py
b/Lib/test/test_pathlib/test_pathlib_abc.py
index ee4c2b59fb9a39..68fe3521410f25 100644
--- a/Lib/test/test_pathlib/test_pathlib_abc.py
+++ b/Lib/test/test_pathlib/test_pathlib_abc.py
@@ -1107,7 +1107,7 @@ def test_glob_posix(self):
p = P(self.base)
q = p / "FILEa"
given = set(p.glob("FILEa"))
- expect = {q} if q.exists() else set()
+ expect = {q} if q.info.exists() else set()
self.assertEqual(given, expect)
self.assertEqual(set(p.glob("FILEa*")), set())
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]