[Python-Dev] Issue 11406: adding os.scandir(), a directory iterator returning stat-like info (original) (raw)

Christian Heimes christian at python.org
Fri May 10 13:46:30 CEST 2013


Am 10.05.2013 12:55, schrieb Ben Hoyt:

Higher-level functions like os.walk() would then check the fields they needed are not None, and only call os.stat() if needed, for example:

# Build lists of files and directories in path files = [] dirs = [] for name, st in os.scandir(path): if st.stmode is None: st = os.stat(os.path.join(path, name)) if stat.SISDIR(st.stmode): dirs.append(name) else: files.append(name)

Have you actually tried the code? It can't give you correct answers. The struct dirent.d_type member as returned by readdir() has different values than stat.st_mode's file type.

For example on my system readdir() returns DT_DIR for a directory but S_ISDIR() checks different bits:

DT_DIR = 4

S_ISDIR(mode) ((mode) & 0170000) == 0040000

Or are you proposing to map d_type to st_mode? That's also problematic because st_mode would only have file type bits, not permission bits. Also POSIX standards state that new file types will not get additional S_IF* constant assigned to. Some operation systems have IFTODT() / DTTOIF() macros which convert bits between st_mode and d_type but the macros aren't part of POSIX standard.

Hence I'm +1 on the general idea but -1 on something stat like. IMHO os.scandir() should yield four objects:

stat_result shall only be returned when the operating systems provides a full stat result as returned by os.stat().

Christian



More information about the Python-Dev mailing list