[Python-Dev] My summary of the scandir (PEP 471) (original) (raw)
Victor Stinner victor.stinner at gmail.com
Tue Jul 1 09:48:49 CEST 2014
- Previous message: [Python-Dev] PEP 471: scandir(fd) and pathlib.Path(name, dir_fd=None)
- Next message: [Python-Dev] My summary of the scandir (PEP 471)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi,
@Ben: it's time to update your PEP to complete it with this discussion! IMO DirEntry must be as simple as possible and portable:
- os.scandir(str)
- DirEntry.lstat_result object only available on Windows, same result than os.lstat()
- DirEntry.fullname(): os.path.join(directory, DirEntry.name), where directory would be an hidden attribute of DirEntry
Notes:
DirEntry.lstat_result is better than DirEntry.lstat() because it makes explicitly that lstat_result is only computed once. When I call DirEntry.lstat(), I expect to get the current status of the file, not the cached one. It's also hard to explain (document) that DirEntry.lstat() may or may call a system call. Don't do that, use DirEntry.lstat_result.
I don't think that we should support scandir(bytes). If you really want to support os.scandir(bytes), it must raise an error on Windows since bytes filename are already deprecated. It wouldn't make sense to add new function with a deprecated feature. Since we have the PEP 383 (surrogateescape), it's better to advice to use Unicode on all platforms. Almost all Python functions are able to encode back Unicode filename automatically. Use os.fsencode() to encode manually if needd.
We may not define a DirEntry.fullname() method: the directory name is usually well known. Ok, but every time that I use os.listdir(), I write os.path.join(directory, name) because in some cases I want the full path. Example:
interesting = [] for name in os.listdir(path): fullpath = os.path.join(path, name) if os.path.isdir(fullpath): continue if ... test on the file ...: # i need the full path here, not the relative path # (ex: my own recursive "scandir"/"walk" function) interesting.append(fullpath)
It must not be possible to "refresh" a DirEntry object. Call os.stat(entry.fullname()) or pathlib.Path(entry.fullname()) to get fresh data. DirEntry is only computed once, that's all. It's well defined.
No Windows wildcard, you wrote that the feature has many corner cases, and it's only available on Windows. It's easy to combine scandir with fnmatch.
Victor
- Previous message: [Python-Dev] PEP 471: scandir(fd) and pathlib.Path(name, dir_fd=None)
- Next message: [Python-Dev] My summary of the scandir (PEP 471)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]