variables bound in moudules are None when module is not completely imported

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Wed Feb 25 20:18:00 EST 2009


En Wed, 25 Feb 2009 21:24:33 -0200, <chrysn at fsfe.org> escribió:
> On Wed, Feb 25, 2009 at 05:05:28PM -0200, Gabriel Genellina wrote:

>> I'd try to move all the global stuff in that module into a function,
>> "init". Importing the module will always succeed - you have to manually
>> call init() after importing it.
>
> i normally do that anyway and would also have done so here (afaik, it's
> best practice anyway), but this is in this case not possible as the
> modules in question are not under my control at all. as pep 299 has been
> turned down, this can't really be considered a bug of those files.

You might ask the module author for this feature... At least, try to move  
the "registration" at the end, after any code likely to raise exceptions.

> anyway, it would just be another workaround around the globals
> disappearing.
>
>> That makes a strange situation where the module doesn't exist in
>> sys.modules but its globals are still alive...
>
> is this a known bug?

Not that I know.

> i mean from a garbage collection / refcount point
> of view, at least everything that is still referenced somewhere should
> be preserved.

In older Python versions, an error when importing a module could leave a  
module object in sys.module partially initialized. That's very bad! Now,  
the entry in sys.modules is removed in such cases. Note that functions and  
classes defined inside a module don't have a reference to the module  
itself - their __module__ attribute is a string (although functions *do*  
have a reference to the module namespace, as you have remarked). So the  
entry in sys.modules is likely to be the last and only reference, and when  
it's removed, the module is deleted. This is a very tricky operation and  
at some stage involves setting all globals to None; if not were for any  
external references (like a callback registered somewhere else, as in your  
case) the module plus the functions and classes and objects defined inside  
it plus its global namespace, all of these should disappear, kaput, gone.

You should report it at http://bugs.python.org -- I don't think this is  
likely to be "fixed" now, but at least it's on record. And when someone  
attempts to improve the module destruction sequence, there is a better  
chance this is taken into account too.

-- 
Gabriel Genellina




More information about the Python-list mailing list