diff --git a/Lib/pathlib.py b/Lib/pathlib.py index f1a33178e2958b..21424ced367653 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -9,7 +9,6 @@ import warnings from _collections_abc import Sequence from errno import ENOENT, ENOTDIR, EBADF, ELOOP -from operator import attrgetter from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO from urllib.parse import quote_from_bytes as urlquote_from_bytes @@ -364,7 +363,7 @@ def group(self, path): # # Globbing helpers # - +@functools.lru_cache def _make_selector(pattern_parts, flavour): pat = pattern_parts[0] child_parts = pattern_parts[1:] @@ -378,9 +377,6 @@ def _make_selector(pattern_parts, flavour): cls = _PreciseSelector return cls(pat, child_parts, flavour) -if hasattr(functools, "lru_cache"): - _make_selector = functools.lru_cache()(_make_selector) - class _Selector: """A selector matches a specific glob pattern part against the children @@ -565,6 +561,7 @@ def __reduce__(self): return (self.__class__, tuple(self._parts)) @classmethod + @functools.cache def _parse_args(cls, args): # This is useful when you don't want to create an instance, just # canonicalize some constructor arguments. @@ -693,11 +690,15 @@ def __ge__(self, other): def __class_getitem__(cls, type): return cls - drive = property(attrgetter('_drv'), - doc="""The drive prefix (letter or UNC path), if any.""") + @property + def drive(self): + """The drive prefix (letter or UNC path), if any.""" + return self._drv - root = property(attrgetter('_root'), - doc="""The root of the path, if any.""") + @property + def root(self): + """The root of the path, if any.""" + return self._root @property def anchor(self): @@ -856,7 +857,7 @@ def __truediv__(self, key): def __rtruediv__(self, key): try: - return self._from_parts([key] + self._parts) + return self._from_parts((key, *self._parts)) except TypeError: return NotImplemented @@ -1057,7 +1058,7 @@ def absolute(self): return self # FIXME this must defer to the specific flavour (and, under Windows, # use nt._getfullpathname()) - return self._from_parts([self._accessor.getcwd()] + self._parts) + return self._from_parts((self._accessor.getcwd(), *self._parts)) def resolve(self, strict=False): """ @@ -1436,7 +1437,7 @@ def expanduser(self): homedir = self._accessor.expanduser(self._parts[0]) if homedir[:1] == "~": raise RuntimeError("Could not determine home directory.") - return self._from_parts([homedir] + self._parts[1:]) + return self._from_parts((homedir, *self._parts[1:])) return self diff --git a/Misc/NEWS.d/next/Library/2022-01-05-11-36-28.bpo-46148.FCtoon.rst b/Misc/NEWS.d/next/Library/2022-01-05-11-36-28.bpo-46148.FCtoon.rst new file mode 100644 index 00000000000000..1e6f2b48f4a66b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-05-11-36-28.bpo-46148.FCtoon.rst @@ -0,0 +1 @@ +Speedup :class:`~pathlib.Path` creation up to ``3x``. Patch by Kumar Aditya. \ No newline at end of file