By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,933 Members | 1,563 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,933 IT Pros & Developers. It's quick & easy.

Reload() Confusion

P: n/a
I'm going to be teaching EEs some basic Python using the first few
chapters of Learning Python, 2nd ed. by Mark Lutz. The discussion on
Reloading Modules starting on page 266 is confusing and I believe
incorrect. On page 266 it says that a reload "changes the existing
module object in place." That's a little vague, but on page 267 it
says "every reference to a module object anywhere in your program is
automatically affected by a reload."

It is my understanding that the reloaded objects become *new* objects
in memory, available only via a fully-qualified reference to the new
module. The old objects remain in memory until the last reference to
them is gone.

I've re-written the section on Reload Basics, and I would like to get
some comments, both on correctness and clarity.

http://ece.arizona.edu/~edatools/Python/Reload.htm

Your help will be appreciated, both by me and by the students
struggling through this the first time.

-- Dave

Jul 18 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
In article <u4********************************@4ax.com>,
David MacQuigg <dm*@gain.com> wrote:
I'm going to be teaching EEs some basic Python using the first few
chapters of Learning Python, 2nd ed. by Mark Lutz. The discussion on
Reloading Modules starting on page 266 is confusing and I believe
incorrect. On page 266 it says that a reload "changes the existing
module object in place." That's a little vague, but on page 267 it
says "every reference to a module object anywhere in your program is
automatically affected by a reload."

It is my understanding that the reloaded objects become *new* objects
in memory, available only via a fully-qualified reference to the new
module. The old objects remain in memory until the last reference to
them is gone.
It seems to me that the module keeps its identity over
the reload:

Python 2.3 (#46, Jul 29 2003, 18:54:32) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
import re
id(re) 9940176 reload(re) <module 're' from 'E:\bin\Python23\lib\re.py'> id(re) 9940176


I've re-written the section on Reload Basics, and I would like to get
some comments, both on correctness and clarity.

http://ece.arizona.edu/~edatools/Python/Reload.htm

Your help will be appreciated, both by me and by the students
struggling through this the first time.

I agree with you. It seems that the module code is
re-executed in the previously-existing modules namespace.
Wherever that code created new objects the first time, it
will create brand-new objects the second time. Small
integers and interned strings will keep their identities (of
course), as will objects referenced through other modules.
Nothing is explicitely deleted, so bindings can be left over
from the modules prior incarnation.
No other namespaces will be affected except when code in the
module explicitely calls for it.

For what it's worth, the following code:

#=======================
"""M1 version 1"""
a=1
b=2
c=[1]
d=[2]

#=======================
"""M1 version 2"""
a=1
b=4
c=[3]
e=[4]

#=======================
"""test_reload.py"""
import os, shutil
def module_contents (M):
print "Doc: ", M.__doc__
for k, v in M.__dict__.items():
if not k.startswith ("__"):
print "%s:\t%d\t%s" % (k, id(v), v)

def grab_contents (M):
d = {}
for k, v in M.__dict__.items():
if not k.startswith ("__"):
d[k] = v
return d

#os.remove ("M1.pyc")
shutil.copyfile ("M1_1.py", "M1.py")
import M1
module_contents (M1)
mc = grab_contents (M1)

print
os.remove ("M1.pyc")
shutil.copyfile ("M1_2.py", "M1.py")
reload (M1)
module_contents (M1)

print '\nMC:'
for k, v in mc.items():
print "%s:\t%d\t%s" % (k, id(v), v)


Which gives

F:\home\mwilson\Projects\python\testscript>python test_reload.py
Doc: M1 version 1
a: 8463376 1
c: 9940432 [1]
b: 8470496 2
d: 9940368 [2]

Doc: M1 version 2
a: 8463376 1
c: 9940272 [3]
b: 8468480 4
e: 9937584 [4]
d: 9940368 [2]

MC:
a: 8463376 1
c: 9940432 [1]
b: 8470496 2
d: 9940368 [2]
The second os.remove seems to be required in case the reloaded
version of M1.py is older than the imported one.

Regards. Mel.
Jul 18 '05 #2

P: n/a
It is my understanding that the reloaded objects become *new* objects
in memory, available only via a fully-qualified reference to the new
module. The old objects remain in memory until the last reference to
them is gone.


Mel> It seems to me that the module keeps its identity over the reload:

Yup. The module remains the same, but its __dict__ is repopulated.

Skip

Jul 18 '05 #3

P: n/a
I like this code example because it gets the student to think about
how modules are kept in memory. Showing the module's dictionary
before and after a reload is great. I'll try to integrate it into my
presentation, perhaps in place of the second example, which can now
become an exercise. Thanks.

-- Dave

On Sat, 20 Mar 2004 17:55:17 -0500, mw*****@the-wire.com (Mel Wilson)
wrote:
For what it's worth, the following code:

#=======================
"""M1 version 1"""
a=1
b=2
c=[1]
d=[2]

#=======================
"""M1 version 2"""
a=1
b=4
c=[3]
e=[4]

#=======================
"""test_reload.py"""
import os, shutil
def module_contents (M):
print "Doc: ", M.__doc__
for k, v in M.__dict__.items():
if not k.startswith ("__"):
print "%s:\t%d\t%s" % (k, id(v), v)

def grab_contents (M):
d = {}
for k, v in M.__dict__.items():
if not k.startswith ("__"):
d[k] = v
return d

#os.remove ("M1.pyc")
shutil.copyfile ("M1_1.py", "M1.py")
import M1
module_contents (M1)
mc = grab_contents (M1)

print
os.remove ("M1.pyc")
shutil.copyfile ("M1_2.py", "M1.py")
reload (M1)
module_contents (M1)

print '\nMC:'
for k, v in mc.items():
print "%s:\t%d\t%s" % (k, id(v), v)


Which gives

F:\home\mwilson\Projects\python\testscript>pyth on test_reload.py
Doc: M1 version 1
a: 8463376 1
c: 9940432 [1]
b: 8470496 2
d: 9940368 [2]

Doc: M1 version 2
a: 8463376 1
c: 9940272 [3]
b: 8468480 4
e: 9937584 [4]
d: 9940368 [2]

MC:
a: 8463376 1
c: 9940432 [1]
b: 8470496 2
d: 9940368 [2]
The second os.remove seems to be required in case the reloaded
version of M1.py is older than the imported one.

Regards. Mel.


Jul 18 '05 #4

P: n/a
In article <g2********************************@4ax.com>,
David MacQuigg <dm*@gain.com> wrote:
I like this code example because it gets the student to think about
how modules are kept in memory. Showing the module's dictionary
before and after a reload is great. I'll try to integrate it into my
presentation, perhaps in place of the second example, which can now
become an exercise. Thanks.


Use it in good health.

Mel.
Jul 18 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.