Proposal: Inline Import
Bengt Richter
bokr at oz.net
Sun Dec 11 03:42:12 EST 2005
On Sat, 10 Dec 2005 19:40:08 -0800, Robert Kern <robert.kern at gmail.com> wrote:
>Bengt Richter wrote:
>
>> Are you willing to type a one-letter prefix to your .re ? E.g.,
>>
>> >>> class I(object):
>> ... def __getattr__(self, attr):
>> ... return __import__(attr)
>
>[snip]
>
>> There are special caveats re imports in threads, but otherwise
>> I don't know of any significant downsides to importing at various
>> points of need in the code. The actual import is only done the first time,
>> so it's effectively just a lookup in sys.modules from there on.
>> Am I missing something?
>
>Packages.
>
Ok, if you're willing to add a trailing '._' to indicate the end of a package path,
and start it with a P instead of an I, you could try the following (just a hack, not tested beyond
what you see, (again ;-) )
----< impexpr.py >--------------------
class I(object):
__cache = {}
def __getattr__(self, attr, cache = __cache):
try: return cache[attr]
except KeyError:
cache[attr] = ret = __import__(attr)
return ret
getdotted = __getattr__
class P(I):
def __init__(self):
self.elems = []
def __getattr__(self, attr):
if attr == '_':
dotted = '.'.join(self.elems)
mod = self.getdotted(dotted)
for attr in self.elems[1:]:
mod = getattr(mod, attr)
self.elems = []
return mod
else:
self.elems.append(attr)
return self
P, I = P(), I()
--------------------------------------
>>> from ut.impexpr import I, P
>>> I.math.pi
3.1415926535897931
>>> I.os.path.isfile
<function isfile at 0x02EB5534>
>>> P.ut.miscutil._.prb
<function prb at 0x02F1EBC4>
>>> type(I)._I__cache.keys()
['ut.miscutil', 'os', 'math']
>>> P.ut.miscutil._.disex
<function disex at 0x02F1EDBC>
>>> type(I)._I__cache.keys()
['ut.miscutil', 'os', 'math']
>>> I.ut.miscutil
<module 'ut.miscutil' from 'c:\pywk\ut\miscutil.pyc'>
>>> I.ut
<module 'ut' from 'c:\pywk\ut\__init__.pyc'>
I am not recommending this particularly. I just like to see how close
python already is to allowing the spelling folks initially think requires
a language change ;-)
Regards,
Bengt Richter
More information about the Python-list
mailing list