@@ -373,61 +373,45 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
373373 # minor reason when (say) a thousand readable directories are still
374374 # left to visit.
375375 try :
376- scandir_it = scandir (top )
376+ with scandir (top ) as entries :
377+ for entry in entries :
378+ try :
379+ if followlinks is _walk_symlinks_as_files :
380+ is_dir = entry .is_dir (follow_symlinks = False ) and not entry .is_junction ()
381+ else :
382+ is_dir = entry .is_dir ()
383+ except OSError :
384+ # If is_dir() raises an OSError, consider the entry not to
385+ # be a directory, same behaviour as os.path.isdir().
386+ is_dir = False
387+
388+ if is_dir :
389+ dirs .append (entry .name )
390+ else :
391+ nondirs .append (entry .name )
392+
393+ if not topdown and is_dir :
394+ # Bottom-up: traverse into sub-directory, but exclude
395+ # symlinks to directories if followlinks is False
396+ if followlinks :
397+ walk_into = True
398+ else :
399+ try :
400+ is_symlink = entry .is_symlink ()
401+ except OSError :
402+ # If is_symlink() raises an OSError, consider the
403+ # entry not to be a symbolic link, same behaviour
404+ # as os.path.islink().
405+ is_symlink = False
406+ walk_into = not is_symlink
407+
408+ if walk_into :
409+ walk_dirs .append (entry .path )
377410 except OSError as error :
378411 if onerror is not None :
379412 onerror (error )
380413 continue
381414
382- cont = False
383- with scandir_it :
384- while True :
385- try :
386- try :
387- entry = next (scandir_it )
388- except StopIteration :
389- break
390- except OSError as error :
391- if onerror is not None :
392- onerror (error )
393- cont = True
394- break
395-
396- try :
397- if followlinks is _walk_symlinks_as_files :
398- is_dir = entry .is_dir (follow_symlinks = False ) and not entry .is_junction ()
399- else :
400- is_dir = entry .is_dir ()
401- except OSError :
402- # If is_dir() raises an OSError, consider the entry not to
403- # be a directory, same behaviour as os.path.isdir().
404- is_dir = False
405-
406- if is_dir :
407- dirs .append (entry .name )
408- else :
409- nondirs .append (entry .name )
410-
411- if not topdown and is_dir :
412- # Bottom-up: traverse into sub-directory, but exclude
413- # symlinks to directories if followlinks is False
414- if followlinks :
415- walk_into = True
416- else :
417- try :
418- is_symlink = entry .is_symlink ()
419- except OSError :
420- # If is_symlink() raises an OSError, consider the
421- # entry not to be a symbolic link, same behaviour
422- # as os.path.islink().
423- is_symlink = False
424- walk_into = not is_symlink
425-
426- if walk_into :
427- walk_dirs .append (entry .path )
428- if cont :
429- continue
430-
431415 if topdown :
432416 # Yield before sub-directory traversal if going top down
433417 yield top , dirs , nondirs
0 commit comments