GH-119169: Simplify `os.walk()` exception handling (#121435)

Handle errors from `os.scandir()` and `ScandirIterator` similarly, which
lets us loop over directory entries with `for`.
This commit is contained in:
Barney Gale 2024-07-08 17:41:01 +01:00 committed by GitHub
parent 5289550b33
commit db00fee3a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 50 deletions

View File

@ -373,26 +373,8 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# minor reason when (say) a thousand readable directories are still
# left to visit.
try:
scandir_it = scandir(top)
except OSError as error:
if onerror is not None:
onerror(error)
continue
cont = False
with scandir_it:
while True:
try:
try:
entry = next(scandir_it)
except StopIteration:
break
except OSError as error:
if onerror is not None:
onerror(error)
cont = True
break
with scandir(top) as entries:
for entry in entries:
try:
if followlinks is _walk_symlinks_as_files:
is_dir = entry.is_dir(follow_symlinks=False) and not entry.is_junction()
@ -425,7 +407,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
if walk_into:
walk_dirs.append(entry.path)
if cont:
except OSError as error:
if onerror is not None:
onerror(error)
continue
if topdown:

View File

@ -0,0 +1 @@
Slightly speed up :func:`os.walk` by simplifying exception handling.