[Python-Dev] Fix import errors to have data
Phillip J. Eby
pje at telecommunity.com
Wed Jul 28 19:40:03 CEST 2004
At 09:53 AM 7/28/04 -0700, Guido van Rossum wrote:
> > On Wed, 2004-07-28 at 06:56, Jim Fulton wrote:
> > > Do you think it's practical to limit the effects of module import to
> > > sys.modules, even by convention? Could we say that it is a bug for
> > > code executed during module import to mutate other modules, including
> > > mutating objects contained in those other modules?
>
>I'm uncomfortable with that; while it's indeed conventional for
>modules to mostly define classes and functions (and constants and
>global variables and ...), there are many other useful things one
>could do at module level, and I hesitate to declare those in any way,
>shape or sense frowned upon. You can have stricter rules within a
>project, of course, but I don't want to make this part of the general
>Python culture; your concerns are mostly relevant only for very large
>projects.
And for those very large projects, I'm wondering if what is *really* wanted
is actually to be able to isolate plug-ins or extensions into their own
"module space", similar to the way the Java "classloader" hierarchy
works. In effect, Java can have multiple 'sys' modules, arranged in a
hierarchy. Each classloader has its own sys.path equivalent, and can also
delegate imports to its parent classloader(s), in order to have some
modules shared between child classloaders. Classloaders are typically used
in application servers or other systems that wrap around multiple
third-party application modules, so that each application unit appears to
have the entire VM to itself, even though side-by-side there may be other
applications seeing the same or different versions of various
modules. This effect is achieved by creating a classloader for each
segregated application unit, and then using it to load that application's
main class.
If a mechanism like this were available for Python, then large systems like
Zope could simply (well, maybe *simply* is the wrong word!) load extensions
in a separate "module space". If there's a problem, just throw the whole
thing away, with no side effects in the current module space such as
"insane" half-empty modules.
As a side benefit, individual extensions can depend on/use different
versions of common packages, as long as they get loaded into separate
module spaces. Heck, you can give extensions their own private copy of the
'logging' module, or anything else that has module-level configuration and
doesn't "play nice" when multiple extensions want it configured differently.
I don't know for certain that such a thing is possible using just the
standard import hooks, but it seems to me it might be. If anybody is
interested in such an animal, have a look at:
http://www.eby-sarna.com/pipermail/peak/2004-July/001652.html
and drop me a line. I presume this is offtopic for further discussion on
python-dev unless it's proposed as a stdlib addition, and I don't think it
should be so proposed without first having some field experience in at
least a couple of those "very large projects". My personal interest in
this is mainly aimed at integrating Python with Eclipse, but it seems to me
that systems like Zope and Chandler that want to support large numbers of
third-party plugins, probably want to be able to do things like this. It
would be nice to have a common implementation, or failing that, at least
understand what prevents a common implementation from being practical.
More information about the Python-Dev
mailing list