-
-
Notifications
You must be signed in to change notification settings - Fork 30.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gh-101000: Add os.path.splitroot() #101002
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Drive-by comments from seeing this PR on discourse, feel free to disregard if I'm saying/asking something stupid.
Thanks for the review! All good feedback I think! |
Co-authored-by: Eryk Sun <eryksun@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm persuaded that this is a good idea. Thanks for working on this!
Here's a docs review. Haven't got to looking at the implementation yet (will do soon).
Co-authored-by: Eryk Sun <eryksun@gmail.com>
Co-authored-by: Eryk Sun <eryksun@gmail.com>
... and not belabour the fact that the empty string may be returned as any/all items.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe there are currently no tests that os.path.splitroot
works with os.PathLike
objects. Just trivial tests like this should do fine, but we should make sure it's tested:
cpython/Lib/test/test_ntpath.py
Lines 946 to 947 in 0e75a55
def test_path_splitdrive(self): | |
self._check_function(self.path.splitdrive) |
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Misc/NEWS.d/next/Library/2023-01-12-21-22-20.gh-issue-101000.wz4Xgc.rst
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is looking really good to me now, and I'm very close to hitting "approve". My only concern (other than my comment about the NEWS entry) is that I'm still not sure the test coverage is quite there. It looks like the tests for splitdrive()
account for a lot of edge cases that aren't really tackled in the tests for splitroot()
yet, e.g.
cpython/Lib/test/test_ntpath.py
Lines 117 to 119 in e99e3cd
# Issue #19911: UNC part containing U+0130 | |
self.assertEqual(ntpath.splitdrive('//conky/MOUNTPOİNT/foo/bar'), | |
('//conky/MOUNTPOİNT', '/foo/bar')) |
and
cpython/Lib/test/test_ntpath.py
Lines 129 to 130 in e99e3cd
tester('ntpath.splitdrive("//?/VOLUME{00000000-0000-0000-0000-000000000000}/spam")', | |
('//?/VOLUME{00000000-0000-0000-0000-000000000000}', '/spam')) |
It's true that, since splitdrive()
now uses splitroot()
, these edge cases are in some sense already covered -- the tests for splitdrive()
will start failing if a bug is introduced to splitroot()
at some later date in the future. But it will be highly confusing if the tests for splitdrive()
start failing, yet the tests for splitroot()
all still pass, when the bug is actually in the implementation for splitroot()
.
Hm. I could rename |
Yeah, I think that would make sense! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great to me. Thanks, as ever, for your patience and perseverance!
@eryksun, Any further comments from you? :)
(Planning to merge in a few days, unless @eryksun has any further feedback :) |
Co-authored-by: Eryk Sun <eryksun@gmail.com> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This PR introduces
os.path.splitroot()
. See #101000 for motivation.In
ntpath
, the implementation derives fromsplitdrive()
. Thesplitdrive()
function now callssplitroot()
, and returnsdrive, root + tail
. Other functions now callsplitroot()
rather thansplitdrive()
. In most cases this replaces their own parsing of path roots. It also avoids adding a stack frame.In
posixpath
, thenormpath()
function now callssplitroot()
rather than parsing path roots itself.In
pathlib
, path constructors now callsplitroot()
rather than using a slow OS-agnostic implementation. Performance:Future work:
nt._path_splitroot()