From: Barney Gale Date: Sat, 6 Jan 2024 21:37:38 +0000 (+0000) Subject: GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (#113529) X-Git-Tag: v3.13.0a3~161 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a15a7735e69862fdfc0ed21bc1ade3a32833a01d;p=thirdparty%2FPython%2Fcpython.git GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (#113529) 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()`. --- diff --git a/Lib/pathlib/__init__.py b/Lib/pathlib/__init__.py index d83f29283c73..a432d45bfed3 100644 --- a/Lib/pathlib/__init__.py +++ b/Lib/pathlib/__init__.py @@ -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. diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py index aca2bd5b8514..97663b904c89 100644 --- a/Lib/pathlib/_abc.py +++ b/Lib/pathlib/_abc.py @@ -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.