bpo-33587: inspect.getsource: reorder stat on file in linecache (GH-6805)

* inspect.getsource: avoid stat on file in linecache

The check for os.path.exists() on source file is postponed in
inspect.getsourcefile() until needed avoiding an expensive filesystem
stat call and PEP 302 module loader check is moved last for performance
since it is an uncommon case.
This commit is contained in:
Pankaj Pandey 2022-08-26 10:20:48 -04:00 committed by GitHub
parent 771eff21a0
commit c1581a928c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -946,6 +946,9 @@ def getsourcefile(object):
elif any(filename.endswith(s) for s in
importlib.machinery.EXTENSION_SUFFIXES):
return None
# return a filename found in the linecache even if it doesn't exist on disk
if filename in linecache.cache:
return filename
if os.path.exists(filename):
return filename
# only return a non-existent filename if the module has a PEP 302 loader
@ -954,9 +957,6 @@ def getsourcefile(object):
return filename
elif getattr(getattr(module, "__spec__", None), "loader", None) is not None:
return filename
# or it is in the linecache
elif filename in linecache.cache:
return filename
def getabsfile(object, _filename=None):
"""Return an absolute path to the source or compiled file for an object.