On Fri, Oct 18, 2013 at 9:06 PM, Nick Coghlan <ncogh...@gmail.com> wrote:
> > On 19 Oct 2013 03:24, "brett.cannon" <python-check...@python.org> wrote: > > > > http://hg.python.org/cpython/rev/11f2f4af1979 > > changeset: 86444:11f2f4af1979 > > user: Brett Cannon <br...@python.org> > > date: Fri Oct 18 13:24:13 2013 -0400 > > summary: > > 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). > > I don't follow this logic. There's now not even an existence check for the > base name, so it reads to me like we will look for all the possible init > file extensions even if there's *no* directory with an appropriate name. > > What am I missing? > ``if cache_module in cache:``, the line above the _path_join() call and the guard that blocks the entire package search. -Brett > Cheers, > Nick. > > > > > 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. > > > > files: > > Lib/importlib/_bootstrap.py | 19 +- > > Python/importlib.h | 1537 +++++++++++----------- > > 2 files changed, 777 insertions(+), 779 deletions(-) > > > > > > diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py > > --- a/Lib/importlib/_bootstrap.py > > +++ b/Lib/importlib/_bootstrap.py > > @@ -1406,16 +1406,15 @@ > > # 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) > > diff --git a/Python/importlib.h b/Python/importlib.h > > --- a/Python/importlib.h > > +++ b/Python/importlib.h > > [stripped] > > > > -- > > Repository URL: http://hg.python.org/cpython > > > > _______________________________________________ > > Python-checkins mailing list > > python-check...@python.org > > https://mail.python.org/mailman/listinfo/python-checkins > > > > > _______________________________________________ > Python-checkins mailing list > python-check...@python.org > https://mail.python.org/mailman/listinfo/python-checkins > >
_______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com