Description
Feature or enhancement
Add a function that splits a path into a (drive, root, tail)
triad:
- The drive part has the same meaning as in
splitdrive()
- The root part is one of: the empty string, a forward slash, a backward slash (Windows only), or two forward slashes (POSIX only)
- The tail part is everything following the root.
Similarly to splitdrive()
, a splitroot()
function would ensure that drive + root + tail
is the same as the input path.
Pitch
The extra level of detail reflects an extra step in the Windows 'current path' hierarchy -- Windows has both a 'current drive', and a 'current directory' for one or more drives, which results in several kinds of non-absolute paths, e.g. 'foo/bar', '/foo/bar', 'X:foo/bar'
This three-part model is used successfully by pathlib, which exposes root as an attribute, and combines drive + root
as an attribute called anchor. The anchor has useful properties, e.g. comparing two paths anchors can tell us whether a relative_to()
operation is possible.
Pathlib has its own implementation of splitroot()
, but its performance is hamstrung by its need for OS-agnosticism. By moving the implementation into ntpath
and posixpath
we can take advantage of OS-specific rules to improve pathlib performance.
Previous discussion
- https://discuss.python.org/t/add-os-path-splitroot/22243
- https://github.com/python/cpython/pull/31691/files#r944987609
- https://github.com/python/cpython/pull/100351/files/5b67a7489e5518975d0c11033cd35bf60fad0ddf#r1065219273