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