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

os.walk() function and glob module since os.scandir() now directly supports
them.
This commit is contained in:
Serhiy Storchaka 2016-10-05 23:17:10 +03:00
parent fae2829c7a
commit 3ae41554c6
2 changed files with 10 additions and 83 deletions

View File

@ -118,22 +118,13 @@ def _iterdir(dirname, dironly):
else:
dirname = os.curdir
try:
if os.name == 'nt' and isinstance(dirname, bytes):
names = os.listdir(dirname)
if dironly:
for name in names:
if os.path.isdir(os.path.join(dirname, name)):
yield name
else:
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
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:
return

View File

@ -343,12 +343,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# minor reason when (say) a thousand readable directories are still
# left to visit. That logic is copied here.
try:
if name == 'nt' and isinstance(top, bytes):
scandir_it = _dummy_scandir(top)
else:
# Note that scandir is global in this module due
# to earlier import-*.
scandir_it = scandir(top)
# Note that scandir is global in this module due
# to earlier import-*.
scandir_it = scandir(top)
except OSError as error:
if onerror is not None:
onerror(error)
@ -417,67 +414,6 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# Yield after recursion if going bottom up
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")
if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd: