mirror of
https://github.com/python/cpython.git
synced 2024-11-23 09:54:58 +08:00
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:
parent
fae2829c7a
commit
3ae41554c6
23
Lib/glob.py
23
Lib/glob.py
@ -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
|
||||
|
||||
|
70
Lib/os.py
70
Lib/os.py
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user