New submission from mythsmith:

I found a condition where different behaviour could be observed depending on 
how a module is imported. 

It seems to be different to write:

import module
# against:
from package import module

In the attachment you find a minimal package (imptest) with this organization:

imptest
  |-> __init__.py (empty)
  |-> m.py (module which initializes a variable "foo=0")
  |- sub (package)
      |-> __init__.py (empty)
      |-> subm.py (module which, upon import, changes "m.foo=1")

And two scripts which can be directly executed:
  |-> run0.py (using "import m")
  |-> run1.py (using "from imptest import m")

Contents of the module m:
#########################
foo=0
def do():
    global foo
    foo=1
    print('doing foo=',foo)
print("imported foo=",foo)

Contents of module subm:
#######################
from imptest import m
from imptest import m
print("imported sub, foo=",m.foo)

Both run0.py and run1.py imports module m and calls the do() function, thus 
theoretically changing foo to 1.
Both later import the subm module, which in turn imports again the m module. 
What I would expect is that, 
since m is already in memory, it is not really imported again: so foo remains 
equal to 1 also after subm import.

I found that this actually depends on how I imported m in the script.

Contents of run0.py:
####################
import m
m.do()
print("importing subm")
from imptest.sub import subm

Result:
imported m; foo= 0
doing foo= 1
importing subm
imported m; foo= 0
imported sub, foo= 0

As you can see from printout "importing subm", the m module is imported again 
and thus foo is reset to 0. In run1.py, 
I changed the line "import m" to "from imptest import m", and got the expected 
behaviour:

Contents of run1.py:
####################
from imptest import m
m.do()
print("importing subm")
from imptest.sub import subm


Result:
imported m; foo= 0
doing foo= 1
importing subm
imported sub, foo= 1

I know that directly running a module in the first level of a package may seem 
strange or not correct, but could someone explain why this is happening? 
I would expect a module to be loaded in memory at the first import and then 
referred in any way I later or elsewhere in the program choose to import it.

----------
components: Interpreter Core
files: imptest.zip
messages: 218901
nosy: mythsmith
priority: normal
severity: normal
status: open
title: Behaviour of modules depends on how they where imported
type: behavior
versions: Python 2.7, Python 3.2
Added file: http://bugs.python.org/file35314/imptest.zip

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue21553>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to