[Python-Dev] Autoloading? (Making Queue.Queue easier to use)
Greg Ewing
greg.ewing at canterbury.ac.nz
Thu Oct 13 07:25:58 CEST 2005
I wrote:
> I'll see if I can cook up an example of it to show. Be
> warned, it is very hackish...
Well, here it is. It's even slightly uglier than I thought
it would be due to the inability to change the class of a
module these days.
When you run it, you should get
Imported my_module
Loading the spam module
Glorious processed meat product!
Glorious processed meat product!
#--------------------------------------------------------------
#
# test.py
#
import my_module
print "Imported my_module"
my_module.spam()
my_module.spam()
#
# my_module.py
#
import autoloading
autoloading.register(__name__, {'spam': 'spam_module'})
#
# spam_module.py
#
print "Loading the spam module"
def spam():
print "Glorious processed meat product!"
#
# autoloading.py
#
import sys
class AutoloadingModule(object):
def __getattr__(self, name):
modname = self.__dict__['_autoload'][name]
module = __import__(modname, self.__dict__, {}, [name])
value = getattr(module, name)
setattr(self, name, value)
return value
def register(module_name, mapping):
module = sys.modules[module_name]
m2 = AutoloadingModule()
m2.__name__ = module.__name__
m2.__dict__ = module.__dict__
# Drop all references to the original module before assigning
# the _autoload attribute. Otherwise, when the original module
# gets cleared, _autoload is set to None.
sys.modules[module_name] = m2
del module
m2._autoload = mapping
#--------------------------------------------------------------
--
Greg Ewing, Computer Science Dept, +--------------------------------------+
University of Canterbury, | A citizen of NewZealandCorp, a |
Christchurch, New Zealand | wholly-owned subsidiary of USA Inc. |
greg.ewing at canterbury.ac.nz +--------------------------------------+
More information about the Python-Dev
mailing list