Kaydet (Commit) 3ae41554 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #27998: Removed workarounds for supporting bytes paths on Windows in

os.walk() function and glob module since os.scandir() now directly supports
them.
üst fae2829c
No related merge requests found
...@@ -118,22 +118,13 @@ def _iterdir(dirname, dironly): ...@@ -118,22 +118,13 @@ def _iterdir(dirname, dironly):
else: else:
dirname = os.curdir dirname = os.curdir
try: try:
if os.name == 'nt' and isinstance(dirname, bytes): with os.scandir(dirname) as it:
names = os.listdir(dirname) for entry in it:
if dironly: try:
for name in names: if not dironly or entry.is_dir():
if os.path.isdir(os.path.join(dirname, name)): yield entry.name
yield name except OSError:
else: pass
yield from names
else:
with os.scandir(dirname) as it:
for entry in it:
try:
if not dironly or entry.is_dir():
yield entry.name
except OSError:
pass
except OSError: except OSError:
return return
......
...@@ -343,12 +343,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False): ...@@ -343,12 +343,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# minor reason when (say) a thousand readable directories are still # minor reason when (say) a thousand readable directories are still
# left to visit. That logic is copied here. # left to visit. That logic is copied here.
try: try:
if name == 'nt' and isinstance(top, bytes): # Note that scandir is global in this module due
scandir_it = _dummy_scandir(top) # to earlier import-*.
else: scandir_it = scandir(top)
# Note that scandir is global in this module due
# to earlier import-*.
scandir_it = scandir(top)
except OSError as error: except OSError as error:
if onerror is not None: if onerror is not None:
onerror(error) onerror(error)
...@@ -417,67 +414,6 @@ def walk(top, topdown=True, onerror=None, followlinks=False): ...@@ -417,67 +414,6 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# Yield after recursion if going bottom up # Yield after recursion if going bottom up
yield top, dirs, nondirs yield top, dirs, nondirs
class _DummyDirEntry:
"""Dummy implementation of DirEntry
Only used internally by os.walk(bytes). Since os.walk() doesn't need the
follow_symlinks parameter: don't implement it, always follow symbolic
links.
"""
def __init__(self, dir, name):
self.name = name
self.path = path.join(dir, name)
# Mimick FindFirstFile/FindNextFile: we should get file attributes
# while iterating on a directory
self._stat = None
self._lstat = None
try:
self.stat(follow_symlinks=False)
except OSError:
pass
def stat(self, *, follow_symlinks=True):
if follow_symlinks:
if self._stat is None:
self._stat = stat(self.path)
return self._stat
else:
if self._lstat is None:
self._lstat = stat(self.path, follow_symlinks=False)
return self._lstat
def is_dir(self):
if self._lstat is not None and not self.is_symlink():
# use the cache lstat
stat = self.stat(follow_symlinks=False)
return st.S_ISDIR(stat.st_mode)
stat = self.stat()
return st.S_ISDIR(stat.st_mode)
def is_symlink(self):
stat = self.stat(follow_symlinks=False)
return st.S_ISLNK(stat.st_mode)
class _dummy_scandir:
# listdir-based implementation for bytes patches on Windows
def __init__(self, dir):
self.dir = dir
self.it = iter(listdir(dir))
def __iter__(self):
return self
def __next__(self):
return _DummyDirEntry(self.dir, next(self.it))
def __enter__(self):
return self
def __exit__(self, *args):
self.it = iter(())
__all__.append("walk") __all__.append("walk")
if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd: if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
......
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