mirror of
https://github.com/python/cpython.git
synced 2025-10-17 04:08:28 +00:00
GH-127456: pathlib ABCs: add protocol for path parser (#127494)
Change the default value of `PurePathBase.parser` from `ParserBase()` to `posixpath`. As a result, user subclasses of `PurePathBase` and `PathBase` use POSIX path syntax by default, which is very often desirable. Move `pathlib._abc.ParserBase` to `pathlib._types.Parser`, and convert it to a runtime-checkable protocol. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
parent
e85f2f1703
commit
5c89adf385
3 changed files with 32 additions and 107 deletions
|
@ -13,6 +13,7 @@ resemble pathlib's PurePath and Path respectively.
|
|||
|
||||
import functools
|
||||
import operator
|
||||
import posixpath
|
||||
from errno import EINVAL
|
||||
from glob import _GlobberBase, _no_recurse_symlinks
|
||||
from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO
|
||||
|
@ -33,59 +34,6 @@ def _is_case_sensitive(parser):
|
|||
return parser.normcase('Aa') == 'Aa'
|
||||
|
||||
|
||||
|
||||
class ParserBase:
|
||||
"""Base class for path parsers, which do low-level path manipulation.
|
||||
|
||||
Path parsers provide a subset of the os.path API, specifically those
|
||||
functions needed to provide PurePathBase functionality. Each PurePathBase
|
||||
subclass references its path parser via a 'parser' class attribute.
|
||||
|
||||
Every method in this base class raises an UnsupportedOperation exception.
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def _unsupported_msg(cls, attribute):
|
||||
return f"{cls.__name__}.{attribute} is unsupported"
|
||||
|
||||
@property
|
||||
def sep(self):
|
||||
"""The character used to separate path components."""
|
||||
raise UnsupportedOperation(self._unsupported_msg('sep'))
|
||||
|
||||
def join(self, path, *paths):
|
||||
"""Join path segments."""
|
||||
raise UnsupportedOperation(self._unsupported_msg('join()'))
|
||||
|
||||
def split(self, path):
|
||||
"""Split the path into a pair (head, tail), where *head* is everything
|
||||
before the final path separator, and *tail* is everything after.
|
||||
Either part may be empty.
|
||||
"""
|
||||
raise UnsupportedOperation(self._unsupported_msg('split()'))
|
||||
|
||||
def splitdrive(self, path):
|
||||
"""Split the path into a 2-item tuple (drive, tail), where *drive* is
|
||||
a device name or mount point, and *tail* is everything after the
|
||||
drive. Either part may be empty."""
|
||||
raise UnsupportedOperation(self._unsupported_msg('splitdrive()'))
|
||||
|
||||
def splitext(self, path):
|
||||
"""Split the path into a pair (root, ext), where *ext* is empty or
|
||||
begins with a period and contains at most one period,
|
||||
and *root* is everything before the extension."""
|
||||
raise UnsupportedOperation(self._unsupported_msg('splitext()'))
|
||||
|
||||
def normcase(self, path):
|
||||
"""Normalize the case of the path."""
|
||||
raise UnsupportedOperation(self._unsupported_msg('normcase()'))
|
||||
|
||||
def isabs(self, path):
|
||||
"""Returns whether the path is absolute, i.e. unaffected by the
|
||||
current directory or drive."""
|
||||
raise UnsupportedOperation(self._unsupported_msg('isabs()'))
|
||||
|
||||
|
||||
class PathGlobber(_GlobberBase):
|
||||
"""
|
||||
Class providing shell-style globbing for path objects.
|
||||
|
@ -115,7 +63,7 @@ class PurePathBase:
|
|||
# the `__init__()` method.
|
||||
'_raw_paths',
|
||||
)
|
||||
parser = ParserBase()
|
||||
parser = posixpath
|
||||
_globber = PathGlobber
|
||||
|
||||
def __init__(self, *args):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue