Use the new `PathBase.scandir()` method in `PathBase.walk()`, which greatly
reduces the number of `PathBase.stat()` calls needed when walking.
There are no user-facing changes, because the pathlib ABCs are still
private and `Path.walk()` doesn't use the implementation in its superclass.
if not top_down:
paths.append((path, dirnames, filenames))
try:
- for child in path.iterdir():
- try:
- if child.is_dir(follow_symlinks=follow_symlinks):
- if not top_down:
- paths.append(child)
- dirnames.append(child.name)
- else:
- filenames.append(child.name)
- except OSError:
- filenames.append(child.name)
+ with path.scandir() as entries:
+ for entry in entries:
+ name = entry.name
+ try:
+ if entry.is_dir(follow_symlinks=follow_symlinks):
+ if not top_down:
+ paths.append(path.joinpath(name))
+ dirnames.append(name)
+ else:
+ filenames.append(name)
+ except OSError:
+ filenames.append(name)
except OSError as error:
if on_error is not None:
on_error(error)
if self.can_symlink:
# Add some symlinks
source.joinpath('linkC').symlink_to('fileC')
- source.joinpath('linkD').symlink_to('dirD')
+ source.joinpath('linkD').symlink_to('dirD', target_is_directory=True)
# Perform the copy
target = base / 'copyC'
f.write(f"I'm {path} and proud of it. Blame test_pathlib.\n")
if self.can_symlink:
- self.link_path.symlink_to(t2_path)
+ self.link_path.symlink_to(t2_path, target_is_directory=True)
broken_link_path.symlink_to('broken')
broken_link2_path.symlink_to(self.cls('tmp3', 'broken'))
self.sub2_tree = (self.sub2_path, [], ["broken_link", "broken_link2", "link", "tmp3"])