mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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:
parent
5289550b33
commit
db00fee3a2
2 changed files with 35 additions and 50 deletions
26
Lib/os.py
26
Lib/os.py
|
@ -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:
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Slightly speed up :func:`os.walk` by simplifying exception handling.
|
Loading…
Add table
Add a link
Reference in a new issue