diff options
author | Brett Cannon <brett@python.org> | 2013-10-18 17:24:13 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2013-10-18 17:24:13 (GMT) |
commit | 58f56804629e177e3d05c45542cd793c3177de40 (patch) | |
tree | 671eec5dedbb31533471ab9e86e4aba070707fce /Lib/importlib | |
parent | 2546a177650264205e8a52b6836bc5b8c48bf085 (diff) | |
download | cpython-58f56804629e177e3d05c45542cd793c3177de40.zip cpython-58f56804629e177e3d05c45542cd793c3177de40.tar.gz cpython-58f56804629e177e3d05c45542cd793c3177de40.tar.bz2 |
Issue #18810: Be optimistic with stat calls when seeing if a directory
exists when checking for a package.
Before there was an isdir check and then various isfile checks for
possible __init__ files when looking for a package.
This change drops the isdir check by leaning
on the assumption that a directory will not contain something named
after the module being imported which is not a directory. If the module
is a package then it saves a stat call. If there is nothing in the
directory with the potential package name it also saves a stat call.
Only if there is something in the directory named the same thing as
the potential package will the number of stat calls increase
(due to more wasteful __init__ checks).
Semantically there is no change as the isdir check moved
down so that namespace packages continue to have no chance of
accidentally collecting non-existent directories.
Diffstat (limited to 'Lib/importlib')
-rw-r--r-- | Lib/importlib/_bootstrap.py | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 842aecc..880a9ec 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1406,16 +1406,15 @@ class FileFinder: # Check if the module is the name of a directory (and thus a package). if cache_module in cache: base_path = _path_join(self.path, tail_module) - if _path_isdir(base_path): - for suffix, loader in self._loaders: - init_filename = '__init__' + suffix - full_path = _path_join(base_path, init_filename) - if _path_isfile(full_path): - return (loader(fullname, full_path), [base_path]) - else: - # A namespace package, return the path if we don't also - # find a module in the next section. - is_namespace = True + for suffix, loader in self._loaders: + init_filename = '__init__' + suffix + full_path = _path_join(base_path, init_filename) + if _path_isfile(full_path): + return (loader(fullname, full_path), [base_path]) + else: + # If a namespace package, return the path if we don't + # find a module in the next section. + is_namespace = _path_isdir(base_path) # Check for a file w/ a proper suffix exists. for suffix, loader in self._loaders: full_path = _path_join(self.path, tail_module + suffix) |