https://github.com/python/cpython/commit/823a38a960c245cbf309ef29120d3690ba1bcd2c
commit: 823a38a960c245cbf309ef29120d3690ba1bcd2c
branch: main
author: Barney Gale <[email protected]>
committer: barneygale <[email protected]>
date: 2024-01-27T19:59:51Z
summary:
GH-79634: Speed up pathlib globbing by removing `joinpath()` call. (#114623)
Remove `self.joinpath('')` call that should have been removed in 6313cdde.
This makes `PathBase.glob('')` yield itself *without* adding a trailing slash.
It's hard to say whether this is more or less correct, but at least everything
else is faster, and there's no behaviour change in the public classes where
empty glob patterns are disallowed.
files:
M Lib/pathlib/_abc.py
M Lib/test/test_pathlib/test_pathlib.py
M Lib/test/test_pathlib/test_pathlib_abc.py
diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py
index 6303a18680befc..ad5684829ebc80 100644
--- a/Lib/pathlib/_abc.py
+++ b/Lib/pathlib/_abc.py
@@ -771,7 +771,7 @@ def glob(self, pattern, *, case_sensitive=None,
follow_symlinks=None):
filter_paths = False
deduplicate_paths = False
sep = self.pathmod.sep
- paths = iter([self.joinpath('')] if self.is_dir() else [])
+ paths = iter([self] if self.is_dir() else [])
while stack:
part = stack.pop()
if part in specials:
diff --git a/Lib/test/test_pathlib/test_pathlib.py
b/Lib/test/test_pathlib/test_pathlib.py
index 9c2b26d41d73f8..5ce3b605c58e63 100644
--- a/Lib/test/test_pathlib/test_pathlib.py
+++ b/Lib/test/test_pathlib/test_pathlib.py
@@ -1232,6 +1232,8 @@ def test_glob_empty_pattern(self):
list(p.glob(''))
with self.assertRaisesRegex(ValueError, 'Unacceptable pattern'):
list(p.glob('.'))
+ with self.assertRaisesRegex(ValueError, 'Unacceptable pattern'):
+ list(p.glob('./'))
def test_glob_many_open_files(self):
depth = 30
diff --git a/Lib/test/test_pathlib/test_pathlib_abc.py
b/Lib/test/test_pathlib/test_pathlib_abc.py
index ea70931eaa2c7e..ab989cb5503f99 100644
--- a/Lib/test/test_pathlib/test_pathlib_abc.py
+++ b/Lib/test/test_pathlib/test_pathlib_abc.py
@@ -1733,12 +1733,11 @@ def test_glob_windows(self):
self.assertEqual(set(map(str, p.glob("F*a"))), {f"{p}\\fileA"})
def test_glob_empty_pattern(self):
- def _check(glob, expected):
- self.assertEqual(set(glob), { P(self.base, q) for q in expected })
P = self.cls
p = P(self.base)
- _check(p.glob(""), [""])
- _check(p.glob("."), ["."])
+ self.assertEqual(list(p.glob("")), [p])
+ self.assertEqual(list(p.glob(".")), [p / "."])
+ self.assertEqual(list(p.glob("./")), [p / "./"])
def test_glob_case_sensitive(self):
P = self.cls
_______________________________________________
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]