Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/genericpath.py: 7%
72 statements
« prev ^ index » next coverage.py v7.0.5, created at 2023-01-17 06:13 +0000
« prev ^ index » next coverage.py v7.0.5, created at 2023-01-17 06:13 +0000
1"""
2Path operations common to more than one OS
3Do not use directly. The OS specific modules import the appropriate
4functions from this module themselves.
5"""
6import os
7import stat
9__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
10 'getsize', 'isdir', 'isfile', 'samefile', 'sameopenfile',
11 'samestat']
14# Does a path exist?
15# This is false for dangling symbolic links on systems that support them.
16def exists(path):
17 """Test whether a path exists. Returns False for broken symbolic links"""
18 try:
19 os.stat(path)
20 except (OSError, ValueError):
21 return False
22 return True
25# This follows symbolic links, so both islink() and isdir() can be true
26# for the same path on systems that support symlinks
27def isfile(path):
28 """Test whether a path is a regular file"""
29 try:
30 st = os.stat(path)
31 except (OSError, ValueError):
32 return False
33 return stat.S_ISREG(st.st_mode)
36# Is a path a directory?
37# This follows symbolic links, so both islink() and isdir()
38# can be true for the same path on systems that support symlinks
39def isdir(s):
40 """Return true if the pathname refers to an existing directory."""
41 try:
42 st = os.stat(s)
43 except (OSError, ValueError):
44 return False
45 return stat.S_ISDIR(st.st_mode)
48def getsize(filename):
49 """Return the size of a file, reported by os.stat()."""
50 return os.stat(filename).st_size
53def getmtime(filename):
54 """Return the last modification time of a file, reported by os.stat()."""
55 return os.stat(filename).st_mtime
58def getatime(filename):
59 """Return the last access time of a file, reported by os.stat()."""
60 return os.stat(filename).st_atime
63def getctime(filename):
64 """Return the metadata change time of a file, reported by os.stat()."""
65 return os.stat(filename).st_ctime
68# Return the longest prefix of all list elements.
69def commonprefix(m):
70 "Given a list of pathnames, returns the longest common leading component"
71 if not m: return ''
72 # Some people pass in a list of pathname parts to operate in an OS-agnostic
73 # fashion; don't try to translate in that case as that's an abuse of the
74 # API and they are already doing what they need to be OS-agnostic and so
75 # they most likely won't be using an os.PathLike object in the sublists.
76 if not isinstance(m[0], (list, tuple)):
77 m = tuple(map(os.fspath, m))
78 s1 = min(m)
79 s2 = max(m)
80 for i, c in enumerate(s1):
81 if c != s2[i]:
82 return s1[:i]
83 return s1
85# Are two stat buffers (obtained from stat, fstat or lstat)
86# describing the same file?
87def samestat(s1, s2):
88 """Test whether two stat buffers reference the same file"""
89 return (s1.st_ino == s2.st_ino and
90 s1.st_dev == s2.st_dev)
93# Are two filenames really pointing to the same file?
94def samefile(f1, f2):
95 """Test whether two pathnames reference the same actual file or directory
97 This is determined by the device number and i-node number and
98 raises an exception if an os.stat() call on either pathname fails.
99 """
100 s1 = os.stat(f1)
101 s2 = os.stat(f2)
102 return samestat(s1, s2)
105# Are two open files really referencing the same file?
106# (Not necessarily the same file descriptor!)
107def sameopenfile(fp1, fp2):
108 """Test whether two open file objects reference the same file"""
109 s1 = os.fstat(fp1)
110 s2 = os.fstat(fp2)
111 return samestat(s1, s2)
114# Split a path in root and extension.
115# The extension is everything starting at the last dot in the last
116# pathname component; the root is everything before that.
117# It is always true that root + ext == p.
119# Generic implementation of splitext, to be parametrized with
120# the separators
121def _splitext(p, sep, altsep, extsep):
122 """Split the extension from a pathname.
124 Extension is everything from the last dot to the end, ignoring
125 leading dots. Returns "(root, ext)"; ext may be empty."""
126 # NOTE: This code must work for text and bytes strings.
128 sepIndex = p.rfind(sep)
129 if altsep:
130 altsepIndex = p.rfind(altsep)
131 sepIndex = max(sepIndex, altsepIndex)
133 dotIndex = p.rfind(extsep)
134 if dotIndex > sepIndex:
135 # skip all leading dots
136 filenameIndex = sepIndex + 1
137 while filenameIndex < dotIndex:
138 if p[filenameIndex:filenameIndex+1] != extsep:
139 return p[:dotIndex], p[dotIndex:]
140 filenameIndex += 1
142 return p, p[:0]
144def _check_arg_types(funcname, *args):
145 hasstr = hasbytes = False
146 for s in args:
147 if isinstance(s, str):
148 hasstr = True
149 elif isinstance(s, bytes):
150 hasbytes = True
151 else:
152 raise TypeError(f'{funcname}() argument must be str, bytes, or '
153 f'os.PathLike object, not {s.__class__.__name__!r}') from None
154 if hasstr and hasbytes:
155 raise TypeError("Can't mix strings and bytes in path components") from None