[python] 对 pathlib.Path 实例进行排序.md

# from pathlib.py; 省略了不相关部分

class _WindowsFlavour(_Flavour):
    def casefold(self, s):
        return s.lower()

    def casefold_parts(self, parts):
        return [p.lower() for p in parts]


class _PosixFlavour(_Flavour):
    def casefold(self, s):
        return s

    def casefold_parts(self, parts):
        return parts


class PurePath(object):
  @property
  def _cparts(self):
      # Cached casefolded parts, for hashing and comparison
      try:
        return self._cached_cparts
      except AttributeError:
        self._cached_cparts = self._flavour.casefold_parts(self._parts)
        return self._cached_cparts

  def __lt__(self, other):
    if not isinstance(other, PurePath) or self._flavour is not other._flavour:
      return NotImplemented
    return self._cparts < other._cparts


  @property
  def parts(self):
    """An object providing sequence-like access to the
    components in the filesystem path."""
    # We cache the tuple to avoid building a new one each time .parts
    # is accessed.  XXX is this necessary?
    try:
      return self._pparts
    except AttributeError:
      self._pparts = tuple(self._parts)
      return self._pparts

Path序列进行排序时,Path会将路径按分隔符切分成序列,然后逐元素进行对比,具体来说是在字符首次不相等的时候返回比较结果。
但两个平台下对路径理解不同,windows不考虑路径中字母大小写,因而在排序时会得到与linux下不同的结果。

——> Path.as_posix() 再进行排序

posted @ 2024-12-25 11:11  NoNoe  阅读(27)  评论(0)    收藏  举报