diff options
author | Nice Zombies <nineteendo19d0@gmail.com> | 2024-04-02 20:32:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-02 20:32:35 (GMT) |
commit | cae4cdd07ddfcd8bcc05d683bac53815391c9907 (patch) | |
tree | ffe157efa5168081b7e3e1d40c51f0727b516bf4 /Lib/posixpath.py | |
parent | 8eda146e87d5531c9d2bc62fd1fea3bd3163f9b1 (diff) | |
download | cpython-cae4cdd07ddfcd8bcc05d683bac53815391c9907.zip cpython-cae4cdd07ddfcd8bcc05d683bac53815391c9907.tar.gz cpython-cae4cdd07ddfcd8bcc05d683bac53815391c9907.tar.bz2 |
gh-117349: Micro-optimize a few `os.path` functions (#117350)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: Barney Gale <barney.gale@gmail.com>
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Diffstat (limited to 'Lib/posixpath.py')
-rw-r--r-- | Lib/posixpath.py | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 4fc02be..76ee721 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -213,15 +213,8 @@ def ismount(path): except (OSError, ValueError): return False - dev1 = s1.st_dev - dev2 = s2.st_dev - if dev1 != dev2: - return True # path/.. on a different device as path - ino1 = s1.st_ino - ino2 = s2.st_ino - if ino1 == ino2: - return True # path/.. is the same i-node as path - return False + # path/.. on a different device as path or the same i-node as path + return s1.st_dev != s2.st_dev or s1.st_ino == s2.st_ino # Expand paths beginning with '~' or '~user'. @@ -270,7 +263,7 @@ def expanduser(path): return path name = path[1:i] if isinstance(name, bytes): - name = str(name, 'ASCII') + name = name.decode('ascii') try: pwent = pwd.getpwnam(name) except KeyError: @@ -359,21 +352,19 @@ except ImportError: path = os.fspath(path) if isinstance(path, bytes): sep = b'/' - empty = b'' dot = b'.' dotdot = b'..' else: sep = '/' - empty = '' dot = '.' dotdot = '..' - if path == empty: + if not path: return dot _, initial_slashes, path = splitroot(path) comps = path.split(sep) new_comps = [] for comp in comps: - if comp in (empty, dot): + if not comp or comp == dot: continue if (comp != dotdot or (not initial_slashes and not new_comps) or (new_comps and new_comps[-1] == dotdot)): @@ -396,12 +387,12 @@ else: def abspath(path): """Return an absolute path.""" path = os.fspath(path) - if not isabs(path): - if isinstance(path, bytes): - cwd = os.getcwdb() - else: - cwd = os.getcwd() - path = join(cwd, path) + if isinstance(path, bytes): + if not path.startswith(b'/'): + path = join(os.getcwdb(), path) + else: + if not path.startswith('/'): + path = join(os.getcwd(), path) return normpath(path) @@ -417,6 +408,7 @@ symbolic links encountered in the path.""" # Join two paths, normalizing and eliminating any symbolic links # encountered in the second path. +# Two leading slashes are replaced by a single slash. def _joinrealpath(path, rest, strict, seen): if isinstance(path, bytes): sep = b'/' @@ -427,7 +419,7 @@ def _joinrealpath(path, rest, strict, seen): curdir = '.' pardir = '..' - if isabs(rest): + if rest.startswith(sep): rest = rest[1:] path = sep @@ -439,10 +431,15 @@ def _joinrealpath(path, rest, strict, seen): if name == pardir: # parent dir if path: - path, name = split(path) + parent, name = split(path) if name == pardir: - path = join(path, pardir, pardir) + # ../.. + path = join(path, pardir) + else: + # foo/bar/.. -> foo + path = parent else: + # .. path = pardir continue newpath = join(path, name) |