[Python-Dev] requirements for moving __import__ over to importlib?

Terry Reedy tjreedy at udel.edu
Wed Feb 8 03:54:50 CET 2012


On 2/7/2012 9:35 PM, PJ Eby wrote:
> On Tue, Feb 7, 2012 at 6:40 PM, Terry Reedy <tjreedy at udel.edu
> <mailto:tjreedy at udel.edu>> wrote:
>
>     importlib could provide a parameterized decorator for functions that
>     are the only consumers of an import. It could operate much like this:
>
>     def imps(mod):
>         def makewrap(f):
>             def wrapped(*args, **kwds):
>                 print('first/only call to wrapper')
>                 g = globals()
>                 g[mod] = __import__(mod)
>                 g[f.__name__] = f
>                 f(*args, **kwds)
>             wrapped.__name__ = f.__name__
>             return wrapped
>         return makewrap
>
>     @imps('itertools')
>     def ic():
>         print(itertools.count)
>
>     ic()
>     ic()
>     #
>     first/only call to wrapper
>     <class 'itertools.count'>
>     <class 'itertools.count'>
>
>
> If I were going to rewrite code, I'd just use lazy imports (see
> http://pypi.python.org/pypi/Importing ).  They're even faster than this
> approach (or using plain import statements), as they have zero per-call
> function call overhead.

My code above and Importing, as I understand it, both delay imports 
until needed by using a dummy object that gets replaced at first access. 
(Now that I am reminded, sys.modules is the better place for the dummy 
objects. I just wanted to show that there is a simple solution (though 
more specialized) even for existing code.) The cost of delay, which 
might mean never, is a bit of one-time extra overhead. Both have no 
extra overhead after the first call. Unless delayed importing is made 
standard, both require a bit of extra code somewhere.

>  It's just that not everything I write can depend on Importing.
> Throw an equivalent into the stdlib, though, and I guess I wouldn't have
> to worry about dependencies...

And that is what I think (agree?) should be done to counteract the 
likely slowdown from using importlib.

> (To be clearer; I'm talking about the
> http://peak.telecommunity.com/DevCenter/Importing#lazy-imports feature,
> which sticks a dummy module subclass instance into sys.modules, whose
> __gettattribute__ does a reload() of the module, forcing the normal
> import process to run, after first changing the dummy object's type to
> something that doesn't have the __getattribute__ any more.  This ensures
> that all accesses after the first one are at normal module attribute
> access speed.  That, and the "whenImported" decorator from Importing
> would probably be of general stdlib usefulness too.)

-- 
Terry Jan Reedy



More information about the Python-Dev mailing list