[Python-Dev] Re: Can we limit the effects of module execution to
sys.modules? (was Fix import errors to have data)
Jim Fulton
jim at zope.com
Mon Aug 2 16:30:57 CEST 2004
Tim Peters wrote:
> [Tim, wants to keep insane modules out of sys.modules]
>
> [Jim Fulton]
>
...
>>Do you think it's practical to limit the effects of module import to
>>sys.modules, even by convention?
>
>
> I'm sure you didn't intend that to be *so* extreme -- like surely a
> module is allowed to initialize its own module-level variables. If I
> read "effects" as "effects visible outside the module", then that's
> what you said <wink>.
Yup. :)
>>If it is possible to limit the effects of import (even by convention),
>>then I think it would be practical to roll-back changes to sys.modules.
>>If it's not practical to limit the effects of module import then I think
>>the problem is effectively unsolveable, short of making Python transactional.
>
>
> There we don't agree -- I think it's already practical, based on that
> virtually no Python application *intends* to catch errors from imports
> other than ImportError, so that almost all "real bugs" in module
> initialization are intended to stop execution. In turn, in the cases
> where ImportErrors are intentionally caught now, they generally occur
> in "import blocks" near the starts of all modules in the failing
> import chain, and so none of the modules involved have yet *done* any
> non-trivial initialization -- they're all still trying to import the
> stuff they need to *start* doing the meat of their initialization.
Except in cases where imports are places later in a module to make
circular imports work. It would be nice to disallow circular imports,
although I don't know if that's possible. (Some time, when I have time,
I'd like to see if we can get rid of them in Zope 3. I'd like to have a
tool to report circular imports, to keep them from creeping in, which
they do so easily.)
Having said that, you make a good point. If all modules did their imports
before making any changes outside the modules, then it would be pretty safe
to clean up the imports.
> If
> some modules happen to import successfully along the way, fine, they
> should stay in sys.modules, and then importing them again later won't
> run their initialization code again.
This only works if all of the modules do all of their imports
before doing other work.
If there are circular imports, you could have:
A defines class C
A imports B
B imports C from A
A imports D and gets an import error
If we clean up A and D, then B has a class from a module that doesn't exist.
Hm. Suppose we have:
A imports B
B imports A
A imports D and gets an import error
We clean up A and D. What about the A that was imported into B?
Jim
--
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (540) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the Python-Dev
mailing list