mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
GH-82805: Fix handling of single-dot file extensions in pathlib (#118952)
pathlib now treats "`.`" as a valid file extension (suffix). This brings it in line with `os.path.splitext()`. In the (private) pathlib ABCs, we add a new `ParserBase.splitext()` method that splits a path into a `(root, ext)` pair, like `os.path.splitext()`. This method is called by `PurePathBase.stem`, `suffix`, etc. In a future version of pathlib, we might make these base classes public, and so users will be able to define their own `splitext()` method to control file extension splitting. In `pathlib.PurePath` we add optimised `stem`, `suffix` and `suffixes` properties that don't use `splitext()`, which avoids computing the path base name twice.
This commit is contained in:
parent
0c5ebe13e9
commit
e418fc3a6e
5 changed files with 101 additions and 35 deletions
|
@ -361,6 +361,40 @@ class PurePath(PurePathBase):
|
|||
tail[-1] = name
|
||||
return self._from_parsed_parts(self.drive, self.root, tail)
|
||||
|
||||
@property
|
||||
def stem(self):
|
||||
"""The final path component, minus its last suffix."""
|
||||
name = self.name
|
||||
i = name.rfind('.')
|
||||
if i != -1:
|
||||
stem = name[:i]
|
||||
# Stem must contain at least one non-dot character.
|
||||
if stem.lstrip('.'):
|
||||
return stem
|
||||
return name
|
||||
|
||||
@property
|
||||
def suffix(self):
|
||||
"""
|
||||
The final component's last suffix, if any.
|
||||
|
||||
This includes the leading period. For example: '.txt'
|
||||
"""
|
||||
name = self.name.lstrip('.')
|
||||
i = name.rfind('.')
|
||||
if i != -1:
|
||||
return name[i:]
|
||||
return ''
|
||||
|
||||
@property
|
||||
def suffixes(self):
|
||||
"""
|
||||
A list of the final component's suffixes, if any.
|
||||
|
||||
These include the leading periods. For example: ['.tar', '.gz']
|
||||
"""
|
||||
return ['.' + ext for ext in self.name.lstrip('.').split('.')[1:]]
|
||||
|
||||
def relative_to(self, other, *, walk_up=False):
|
||||
"""Return the relative path to another path identified by the passed
|
||||
arguments. If the operation is not possible (because this is not
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue