homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author mythsmith
Recipients mythsmith
Date 2014年05月22日.15:37:31
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1400773053.58.0.249917369677.issue21553@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2014年05月22日 15:37:33mythsmithsetrecipients: + mythsmith
2014年05月22日 15:37:33mythsmithsetmessageid: <1400773053.58.0.249917369677.issue21553@psf.upfronthosting.co.za>
2014年05月22日 15:37:33mythsmithlinkissue21553 messages
2014年05月22日 15:37:31mythsmithcreate

AltStyle によって変換されたページ (->オリジナル) /