[Python-ideas] Provide a way to import module without exec body

Serhiy Storchaka storchaka at gmail.com
Sun Dec 3 01:58:11 EST 2017


01.12.17 20:12, Neil Schemenauer пише:
> On 2017-12-01, Chris Angelico wrote:
>> Can you elaborate on where this is useful, please?
> 
> Introspection tools, for example, might want to look at the module
> without executing it.  Also, it is a building block to make lazy loading
> of modules work.  As Nick points out, importlib can do this already.
> 
> Currently, the IMPORT_NAME both loads the code for a module and also
> executes it.  The exec happens fairly deep in the guts of importlib.
> This makes import.c and ceval.c mutually recursive.  The locking gets
> complicated.  There are hacks like _call_with_frames_removed() to hide
> the recursion going on.
> 
> Instead, we could have two separate opcodes, one that gets the module
> but does not exec it (i.e. a function like __import__() that returns a
> future) and another opcode that actually does the execution.  Figuring
> out all the details is complicated.

The IMPORT_NAME opcode is highly optimized. In most cases it just looks 
up in sys.modules and check that the module is not imported right now.
I suppose two opcodes will hit performance. And I don't see how this 
could simplify the code.

I suppose the existing importlib machinery already supports loading 
modules without executing them. Maybe not with a single function, but 
with a combination of 2-3 methods. But what you want to get? The source? 
The code object? What about modules implemented in C?



More information about the Python-ideas mailing list