importing part of a module without executing the rest

Ben Finney bignose+hates-spam at benfinney.id.au
Fri Jun 13 20:43:32 EDT 2008


krishna.000.k at gmail.com writes:

> file1.py
> ----------
> a = 20
> from abc import *
> print "Should this be printed when 'a'  is alone imported from this
> module"
> 
> file2.py
> ----------
> from file1 import a
> print a
> 
> file2.py is used in a context where 'from abc import *' statement
> doesn't make sense but it can make sense of (and requires) 'a'.
> But it seems we can't import just a part of the module and expect the
> rest to not be executed.
> Executing python file2.py executes the 'from abc ...' and the print
> statement following it in file1.py.

That's right. That's what 'import' is documented to do.

    Import statements are executed in two steps: (1) find a module,
    and initialize it if necessary; (2) define a name or names in the
    local namespace …

    … to ``initialize'' a Python-coded module meansto execute the
    module's body.

    <URL:http://docs.python.org/ref/import.html>

> Can't I just import 'a' into this name scope without touching the
> rest of the statements in the module (file1 in this case). If so,
> what the rationale behind such logic in the module 'import'
> mechanism of python?

The purpose of dividing code into separate modules is to have all the
code in those modules executed by an 'import' statement. If you want
some code to be executed under some circumstances and other code not
executed, they need to be separated somehow.

> Don't I have any solution other than packaging those parts in
> file1.py (a = 20 and the rest of the statements) into different
> modules?

Let me turn that around: What are you actually trying to do, and how
does that conflict with separating code that seems (from your
description) conceptually separate anyway?

One possible answer could be to define a module-level function. This
would mean that at 'import' time, the 'def' statement is executed and
the function defined, but the code inside it is not executed until you
call the function at some later time. This also has the beneficial
effect of defining a specific interface for using that code.

Whether that's appropriate to your situation is impossible to say
without knowing what you are trying to do.

-- 
 \             “Never do anything against conscience even if the state |
  `\                                     demands it.” —Albert Einstein |
_o__)                                                                  |
Ben Finney



More information about the Python-list mailing list