Skip to content

Commit

Permalink
pythonGH-79634: Speed up pathlib globbing by removing joinpath() ca…
Browse files Browse the repository at this point in the history
…ll. (python#114623)

Remove `self.joinpath('')` call that should have been removed in 6313cdd.

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.
  • Loading branch information
barneygale authored and aisk committed Feb 11, 2024
1 parent 55401d8 commit b45ca16
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Lib/pathlib/_abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions Lib/test/test_pathlib/test_pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 3 additions & 4 deletions Lib/test/test_pathlib/test_pathlib_abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit b45ca16

Please sign in to comment.