Another form of dynamic import

Albert Hopkins marduk at letterboxes.org
Wed Mar 25 20:14:07 CET 2009


Also, instead of caching exceptions you can do lazy lookups kinda like
this:

-------------------------------------------------------------------------------------
# a.py

class A:
    pass

-------------------------------------------------------------------------------------
# b.py

class B:
    pass

-------------------------------------------------------------------------------------
# c.py

class D:
    pass

class E:
    pass

-------------------------------------------------------------------------------------
# iface.py

class LazyInterface(object):
    _attr_dict = dict(A='a', B='b', C='c', D='c')
    _attr_cache = dict()
    _mod_cache = dict()

    def __getattr__(self, name):
        if name in self._attr_cache:
            return self._attr_cache[name]

        elif name in self._attr_dict:
            module_name = self._attr_dict[name]
            self._mod_cache[module_name] = 
		self._mod_cache.get(module_name,__import__(module_name))
            self._attr_cache[name] =
 		getattr(self._mod_cache[module_name], name)
            return self._attr_cache[name]
        else: raise AttributeError


>>> from iface import LazyInterface
>>> i = LazyInterface()
>>> a = i.A()
>>> a
<a.A instance at 0x7fb034317440>
>>> c = i.C()
>>> c
<c.C instance at 0x7fb034317758>
>>> d = i.D()
>>> d
<c.D instance at 0x7fb0343177a0>

There is probably a cleaner/more robust way of doing the above, but you
get the idea.




More information about the Python-list mailing list