Repository navigation
Refactor nt._path_is* & nt._path_[l]exists #118507
Description
Activity
- addedtype-featureA feature request or enhancementA feature request or enhancement
on May 2, 2024 Eryk, do you have any ideas to clean them up (besides the simpler error handling)?
Good start, we probably need a
follow_symlinksoption for_testFileTypeByNameto useLSTAT()though.Did you speed something up, because it's only 3 lines less than the old code.
My goal was to remove duplicated code and divide the work into two separate operations that can be understood and modified independently, written in a way that I think is easy to understand. This reduces the maintenance burden. I also added internal support for checking for mount points, in case we implement
_path_isjunction().I added a
GetFileType()check in the by-handle code. When combined with thediskOnlyparameter, theGetFileType()check makes it safer to check an open file descriptor since the check is implemented directly in the I/O manager without trying to acquire the file lock. IfGetFileInformationByHandleEx()is called on a handle for a synchronous-mode pipe, it could block indefinitely. For example, with the current implementation in 3.12:>>> pr, pw = os.pipe() >>> threading.Thread(target=os.read, args=(pr, 1)).start() >>> os.path.isfile(pr) ^C
Also, given the system's named-pipe filesystem (NPFS) support for basic file information (anonymous pipes are also in NPFS, but they're like unlinked open files in POSIX), the
GetFileType()check avoids classifying pipes as regular files. Again, with the current implementation in 3.12:>>> pr, pw = os.pipe() >>> os.path.isfile(pr) TrueReacted by Nice ZombiesOK, that explains why the code isn't much shorter. I added a test for the second issue. The first one seems difficult to test.
- added a commit that references this issue
on May 21, 2024 - added a commit that references this issue
on May 22, 2024
Feature or enhancement
Proposal:
Quoting @eryksun:
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
ntpath.lexists#117842Linked PRs
nt._path_is*#118755nt._path_is*to improve applicability for other cases (GH-118755) #119360ntpath.isfilefor pipes. #119381ntpath.isjunction()&ntpath.lexists()with native helpers (GH-118755) #119420