]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (#113529)
authorBarney Gale <barney.gale@gmail.com>
Sat, 6 Jan 2024 21:37:38 +0000 (21:37 +0000)
committerGitHub <noreply@github.com>
Sat, 6 Jan 2024 21:37:38 +0000 (21:37 +0000)
Replace use of `_from_parsed_parts()` with `with_segments()` in
`PurePathBase.relative_to()`, and move the assignment of `_drv`, `_root`
and `_tail_cached` slots into `PurePath.relative_to()`.

Lib/pathlib/__init__.py
Lib/pathlib/_abc.py

index d83f29283c735453533cf07cad0533957fa1f499..a432d45bfed3a9850703b0038222058545d5017d 100644 (file)
@@ -245,7 +245,10 @@ class PurePath(_abc.PurePathBase):
                    "scheduled for removal in Python 3.14")
             warnings.warn(msg, DeprecationWarning, stacklevel=2)
             other = self.with_segments(other, *_deprecated)
-        return _abc.PurePathBase.relative_to(self, other, walk_up=walk_up)
+        path = _abc.PurePathBase.relative_to(self, other, walk_up=walk_up)
+        path._drv = path._root = ''
+        path._tail_cached = path._raw_paths.copy()
+        return path
 
     def is_relative_to(self, other, /, *_deprecated):
         """Return True if the path is relative to another path or False.
index aca2bd5b85146dd0ddd78b29d339308f7b5f5f2c..97663b904c891545bce81161ba21cabc8a65643f 100644 (file)
@@ -371,7 +371,7 @@ class PurePathBase:
         else:
             raise ValueError(f"{str(self)!r} and {str(other)!r} have different anchors")
         parts = ['..'] * step + self._tail[len(path._tail):]
-        return self._from_parsed_parts('', '', parts)
+        return self.with_segments(*parts)
 
     def is_relative_to(self, other):
         """Return True if the path is relative to another path or False.