Commit 7c90a82a authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #25995: os.walk() no longer uses FDs proportional to the tree depth.

Different solution from 3.5.
parent ffe96ae1
...@@ -356,6 +356,7 @@ def walk(top, topdown=True, onerror=None, followlinks=False): ...@@ -356,6 +356,7 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
dirs = [] dirs = []
nondirs = [] nondirs = []
walk_dirs = []
# We may not have read permission for top, in which case we can't # We may not have read permission for top, in which case we can't
# get a list of the files the directory contains. os.walk # get a list of the files the directory contains. os.walk
...@@ -414,7 +415,7 @@ def walk(top, topdown=True, onerror=None, followlinks=False): ...@@ -414,7 +415,7 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
walk_into = not is_symlink walk_into = not is_symlink
if walk_into: if walk_into:
yield from walk(entry.path, topdown, onerror, followlinks) walk_dirs.append(entry.path)
# Yield before recursion if going top down # Yield before recursion if going top down
if topdown: if topdown:
...@@ -431,6 +432,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False): ...@@ -431,6 +432,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
if followlinks or not islink(new_path): if followlinks or not islink(new_path):
yield from walk(new_path, topdown, onerror, followlinks) yield from walk(new_path, topdown, onerror, followlinks)
else: else:
# Recurse into sub-directories
for new_path in walk_dirs:
yield from walk(new_path, topdown, onerror, followlinks)
# Yield after recursion if going bottom up # Yield after recursion if going bottom up
yield top, dirs, nondirs yield top, dirs, nondirs
......
...@@ -179,6 +179,8 @@ Core and Builtins ...@@ -179,6 +179,8 @@ Core and Builtins
Library Library
------- -------
- Issue #25995: os.walk() no longer uses FDs proportional to the tree depth.
- Issue #25994: Added the close() method and the support of the context manager - Issue #25994: Added the close() method and the support of the context manager
protocol for the os.scandir() iterator. protocol for the os.scandir() iterator.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment