summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorPankaj Pandey <pankaj86@gmail.com>2022-08-26 14:20:48 (GMT)
committerGitHub <noreply@github.com>2022-08-26 14:20:48 (GMT)
commitc1581a928cc153076593c5c433a8dd36ce10fbfb (patch)
tree0dba5a9e164afda6a4976f76d4322bc29fdf90ab /Lib
parent771eff21a0984327a95013e2bd1d57b1f1a0e89d (diff)
downloadcpython-c1581a928cc153076593c5c433a8dd36ce10fbfb.zip
cpython-c1581a928cc153076593c5c433a8dd36ce10fbfb.tar.gz
cpython-c1581a928cc153076593c5c433a8dd36ce10fbfb.tar.bz2
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.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/inspect.py6
1 files changed, 3 insertions, 3 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index cbc0632..498ee7a 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -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.