Skip to content

Commit

Permalink
Cache case-normalized string.
Browse files Browse the repository at this point in the history
  • Loading branch information
barneygale committed Apr 7, 2023
1 parent c8d4b38 commit d2a578d
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions Lib/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ class PurePath(object):
__slots__ = (
'_raw_path', '_drv', '_root', '_tail_cached',
'_str', '_hash', '_parts_normcase_cached',
'_str_normcase_cached',
)
_flavour = os.path

Expand Down Expand Up @@ -367,25 +368,34 @@ def as_uri(self):
path = str(self)
return prefix + urlquote_from_bytes(os.fsencode(path))

@property
def _str_normcase(self):
# String with normalized case, for hashing and equality checks
try:
return self._str_normcase_cached
except AttributeError:
self._str_normcase_cached = self._flavour.normcase(str(self))
return self._str_normcase_cached

@property
def _parts_normcase(self):
# Cached parts with normalized case, for hashing and comparison.
# Cached parts with normalized case, for comparisons.
try:
return self._parts_normcase_cached
except AttributeError:
self._parts_normcase_cached = [self._flavour.normcase(p) for p in self.parts]
self._parts_normcase_cached = self._str_normcase.split(self._flavour.sep)
return self._parts_normcase_cached

def __eq__(self, other):
if not isinstance(other, PurePath):
return NotImplemented
return self._parts_normcase == other._parts_normcase and self._flavour is other._flavour
return self._str_normcase == other._str_normcase and self._flavour is other._flavour

def __hash__(self):
try:
return self._hash
except AttributeError:
self._hash = hash(tuple(self._parts_normcase))
self._hash = hash(self._str_normcase)
return self._hash

def __lt__(self, other):
Expand Down Expand Up @@ -632,9 +642,9 @@ def match(self, path_pattern):
Return True if this path matches the given pattern.
"""
pat = type(self)(path_pattern)
pat_parts = pat._parts_normcase
if not pat_parts:
if not pat.parts:
raise ValueError("empty pattern")
pat_parts = pat._parts_normcase
parts = self._parts_normcase
if pat.drive or pat.root:
if len(pat_parts) != len(parts):
Expand Down

0 comments on commit d2a578d

Please sign in to comment.