https://github.com/python/cpython/commit/48c84a400aa90014a16ceac92df4b0cf5ca6b3d4
commit: 48c84a400aa90014a16ceac92df4b0cf5ca6b3d4
branch: main
author: Barney Gale <barney.g...@gmail.com>
committer: barneygale <barney.g...@gmail.com>
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 -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to