From d7cef7bc7ea5478abb90a37c8ffb0792cc6e7518 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Sun, 12 Nov 2023 22:59:17 +0000 Subject: GH-111429: Speed up `pathlib.PurePath.[is_]relative_to()` (#111431) --- Lib/pathlib.py | 12 ++++++++---- .../Library/2023-10-28-22-11-11.gh-issue-111429.mJGxuQ.rst | 2 ++ 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-10-28-22-11-11.gh-issue-111429.mJGxuQ.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index e3eecc3..47a043c 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -647,9 +647,11 @@ class PurePath: "scheduled for removal in Python {remove}") warnings._deprecated("pathlib.PurePath.relative_to(*args)", msg, remove=(3, 14)) - other = self.with_segments(other, *_deprecated) + other = self.with_segments(other, *_deprecated) + elif not isinstance(other, PurePath): + other = self.with_segments(other) for step, path in enumerate([other] + list(other.parents)): - if self.is_relative_to(path): + if path == self or path in self.parents: break elif not walk_up: raise ValueError(f"{str(self)!r} is not in the subpath of {str(other)!r}") @@ -658,7 +660,7 @@ class PurePath: else: raise ValueError(f"{str(self)!r} and {str(other)!r} have different anchors") parts = ['..'] * step + self._tail[len(path._tail):] - return self.with_segments(*parts) + return self._from_parsed_parts('', '', parts) def is_relative_to(self, other, /, *_deprecated): """Return True if the path is relative to another path or False. @@ -669,7 +671,9 @@ class PurePath: "scheduled for removal in Python {remove}") warnings._deprecated("pathlib.PurePath.is_relative_to(*args)", msg, remove=(3, 14)) - other = self.with_segments(other, *_deprecated) + other = self.with_segments(other, *_deprecated) + elif not isinstance(other, PurePath): + other = self.with_segments(other) return other == self or other in self.parents @property diff --git a/Misc/NEWS.d/next/Library/2023-10-28-22-11-11.gh-issue-111429.mJGxuQ.rst b/Misc/NEWS.d/next/Library/2023-10-28-22-11-11.gh-issue-111429.mJGxuQ.rst new file mode 100644 index 0000000..c8bc4c5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-10-28-22-11-11.gh-issue-111429.mJGxuQ.rst @@ -0,0 +1,2 @@ +Speed up :meth:`pathlib.PurePath.relative_to` and +:meth:`~pathlib.PurePath.is_relative_to`. -- cgit v0.12