[Python-Dev] Re: [Zope3-dev] Zip import and sys.path manipulation (was Re: directory hierarchy proposal)
Just van Rossum
just@letterror.com
Tue, 17 Dec 2002 00:29:53 +0100
Guido van Rossum wrote:
> > Playing tricks with the contents of pkg.__path__ apparently has its
> > uses,
>
> It's the *defined* API for adding to the set of locations from which
> submodules and subpackages of a package are to be loaded. You can't
> just call that "playing tricks."
pkg.__path__ is a package-local equivalent of sys.path. But if a package
didn't *originate* from sys.path, it makes little sense to demand
pkg.__path__ be a list of strings.
But: it could then just as well be an empty list. With my patch I think
frozen package imports could even be fixed to do that. Hm, that would be
real easy in fact. Will try this out.
> Does the metahook also apply to submodules (or subpackage) of
> packages?
Of course it does. An importer must be able to handle submodules of
packages it loaded, if it wants. Frozen import works that way: in fact
you can see the frozen import mechanism as an imaginary importer on
sys.meta_path. sys.meta_path is simply traversed before
sys.path/pkg.__path__, always.
A big difference between my hooks and the classic
imp.find_module/load_module functions is that my hooks *always* get
called with the fully qualified module name (and have to look up
sys.path or pkg.__path__ by themselves if they need it), and
imp.find_module must be called with a (sub)name and a path argument. The
latter is fine for of sys.path-based imports but is a pain for any
other, as then you somehow need to reconstruct the parent name (which
actually led to freeze (ab)using __path__ to communicate the parent
name).
> I'd expect not. (I haven't had the time to review your latest
> patches yet, in part due to this thread. :-)
Oh, this aspect hasn't changed since since I first posted it on sf, but
I think you spent more time in zipimport.c than in import.c ;-)
> Surely you shouldn't be looking for builtin submodules of a package.
Why not? (Builtin submodules won't work anyway at the moment, but for
other reasons.)
> > Depending on the kind of importer, there are different
> > levels of freedom of what you can use as pkg.__path__.
> >
> > Importer object on sys.meta_path:
> > it can use anything it pleases (even None), as long
> > as a __path__ variable is set.
>
> But I can imagine that some metahooks would like to look inside the
> __path__ list for more hints on where to find the submodules of the
> package. Of course that's up to the metahook.
Exactly. __path__ can be seen as private to an importer. It just happens
to be a list of strings for the sys.path importer ;-).
> > Importer object on sys.path:
> > pkg.__path__ must be a list; it's most logical to use
> > an importer object as the only item. Could be the same
> > importer instance that imported the package itself.
>
> Multiple items would make sense too.
Sure.
> > A hook on sys.path_hooks:
> > pkg.__path__ must be a list and its only item should
> > be a string that the hook can handle itself.
>
> IMO it should allow multiple strings too!
It sure does, I formulated that clumsily. If no meta_path hook picks up
the import, sys.path or pkg.__path__ traversal does its work as usual.
Apart from the sys.path_hooks hookability of sys.path/pkg.__path__
items, nothing was changed here.
> > These are just guidelines: a set of hooks could in theory
> > deliberately set pgk.__path__ up so submodule imports be
> > handled by an entirely different importer. Not sure how
> > useful that would be...
>
> Very useful, for not-yet-imagined cases.
I was just pointing out that it's possible...
Just