GH-113528: Deoptimise pathlib._abc.PurePathBase.name (#113531)

Replace usage of `_from_parsed_parts()` with `with_segments()` in
`with_name()`, and take a similar approach in `name` for consistency's
sake.
This commit is contained in:
Barney Gale 2024-01-06 20:50:25 +00:00 committed by GitHub
parent 2205510e7b
commit 1e914ad89d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 7 deletions

View file

@ -166,6 +166,25 @@ class PurePath(_abc.PurePathBase):
return NotImplemented return NotImplemented
return self._parts_normcase >= other._parts_normcase return self._parts_normcase >= other._parts_normcase
@property
def name(self):
"""The final path component, if any."""
tail = self._tail
if not tail:
return ''
return tail[-1]
def with_name(self, name):
"""Return a new path with the file name changed."""
m = self.pathmod
if not name or m.sep in name or (m.altsep and m.altsep in name) or name == '.':
raise ValueError(f"Invalid name {name!r}")
tail = self._tail.copy()
if not tail:
raise ValueError(f"{self!r} has an empty name")
tail[-1] = name
return self._from_parsed_parts(self.drive, self.root, tail)
def relative_to(self, other, /, *_deprecated, walk_up=False): def relative_to(self, other, /, *_deprecated, walk_up=False):
"""Return the relative path to another path identified by the passed """Return the relative path to another path identified by the passed
arguments. If the operation is not possible (because this is not arguments. If the operation is not possible (because this is not

View file

@ -313,10 +313,10 @@ class PurePathBase:
@property @property
def name(self): def name(self):
"""The final path component, if any.""" """The final path component, if any."""
tail = self._tail path_str = str(self)
if not tail: if not path_str or path_str == '.':
return '' return ''
return tail[-1] return self.pathmod.basename(path_str)
@property @property
def suffix(self): def suffix(self):
@ -360,11 +360,10 @@ class PurePathBase:
m = self.pathmod m = self.pathmod
if not name or m.sep in name or (m.altsep and m.altsep in name) or name == '.': if not name or m.sep in name or (m.altsep and m.altsep in name) or name == '.':
raise ValueError(f"Invalid name {name!r}") raise ValueError(f"Invalid name {name!r}")
tail = self._tail.copy() parent, old_name = m.split(str(self))
if not tail: if not old_name or old_name == '.':
raise ValueError(f"{self!r} has an empty name") raise ValueError(f"{self!r} has an empty name")
tail[-1] = name return self.with_segments(parent, name)
return self._from_parsed_parts(self.drive, self.root, tail)
def with_stem(self, stem): def with_stem(self, stem):
"""Return a new path with the stem changed.""" """Return a new path with the stem changed."""