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

How to clean a module?

P: n/a
ai
It assumes that there is a module A which have two global variables X
and Y. If I run "import A" in the IDLE shell, then I can use A.X and
A.Y correctly. But if I want to change the module A and then delete
the variable Y, I find I can use A.Y just the same as before!
In fact, I have tried all the following methods but can't remove the
A.Y:
execute "import A" again
"reload(A)"
"del A; import A"
Yes, if you use "del A.Y", it works. But it is stupid since there are
probably many names. In my thought, if no one references objects in A,
"del A" will release all memory about A. But it seems that the fact is
not. So I can not refresh the namespace to follow changes of a module
easily and I will worry about the memory if I del a module.
I want to know if there is a way to clear a module entirely.

May 31 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
ai schrieb:
It assumes that there is a module A which have two global variables X
and Y. If I run "import A" in the IDLE shell, then I can use A.X and
A.Y correctly. But if I want to change the module A and then delete
the variable Y, I find I can use A.Y just the same as before!
In fact, I have tried all the following methods but can't remove the
A.Y:
execute "import A" again
"reload(A)"
"del A; import A"
Yes, if you use "del A.Y", it works. But it is stupid since there are
probably many names. In my thought, if no one references objects in A,
"del A" will release all memory about A. But it seems that the fact is
not. So I can not refresh the namespace to follow changes of a module
easily and I will worry about the memory if I del a module.
I want to know if there is a way to clear a module entirely.
There might be other answers - but the easiest and IMHO best is to
simply restart the interpreter. Because whatever you type in there, you
could or should even (if it reaches some complexity) put in a small test
script - and execute that from the interpreter at a shell prompt. The
advantage is that you don't suffer from any side-effects e.g. IDLE has
(no Tk mainloop for example) and avoid the problems you describe
entirely. Together with a bunch of others.

If you want/have to, you can drop into interpreter mode after script
execution with

python -i myscript.py
Diez
May 31 '07 #2

P: n/a
ai a écrit :
It assumes that there is a module A which have two global variables X
and Y. If I run "import A" in the IDLE shell, then I can use A.X and
A.Y correctly. But if I want to change the module A and then delete
the variable Y, I find I can use A.Y just the same as before!
It's unlikely to be true, see below.
In fact, I have tried all the following methods but can't remove the
A.Y:
execute "import A" again
"reload(A)"
"del A; import A"
Yes, if you use "del A.Y", it works. But it is stupid since there are
probably many names. In my thought, if no one references objects in A,
"del A" will release all memory about A. But it seems that the fact is
not. So I can not refresh the namespace to follow changes of a module
easily and I will worry about the memory if I del a module.
I want to know if there is a way to clear a module entirely.
Actually I do not see your problem and your exact need, when I type the
following in python prompt I just see expected behavior, what is a
problem to you ? Maybe you could post a code explaining it.
In [64]: import a

In [65]: a.X

Out[65]: 0

In [66]: a.X = 2

In [67]: del a

In [68]: import a as b

In [69]: b.X

Out[69]: 2

In [71]: for name in [ n for n in b.__dict__ if not n.startswith('__') ]
:
....: b.__dict__.__delitem__(name)

....:

....:

In [72]: b.X

---------------------------------------------------------------------------

<type 'exceptions.AttributeError' Traceback (most recent call
last)
C:\Documents and Settings\maric\Bureau\<ipython consolein <module>()

<type 'exceptions.AttributeError'>: 'module' object has no attribute 'X'

In [73]: reload(b)

Out[73]: <module 'a' from 'a.pyc'>

In [74]: b.X

Out[74]: 0
In [75]: del b.X

In [76]: del b

In [77]: import a

In [78]: a.b

---------------------------------------------------------------------------

<type 'exceptions.AttributeError' Traceback (most recent call
last)
C:\Documents and Settings\maric\Bureau\<ipython consolein <module>()

<type 'exceptions.AttributeError'>: 'module' object has no attribute 'b'

May 31 '07 #3

P: n/a
ai
Yes, you are right.
But from this problem, could I infer that the statement "del xxx"
doesn't release the memory which xxx used?
On May 31, 11:21 pm, "Diez B. Roggisch" <d...@nospam.web.dewrote:
ai schrieb:
It assumes that there is a module A which have two global variables X
and Y. If I run "import A" in the IDLE shell, then I can use A.X and
A.Y correctly. But if I want to change the module A and then delete
the variable Y, I find I can use A.Y just the same as before!
In fact, I have tried all the following methods but can't remove the
A.Y:
execute "import A" again
"reload(A)"
"del A; import A"
Yes, if you use "del A.Y", it works. But it is stupid since there are
probably many names. In my thought, if no one references objects in A,
"del A" will release all memory about A. But it seems that the fact is
not. So I can not refresh the namespace to follow changes of a module
easily and I will worry about the memory if I del a module.
I want to know if there is a way to clear a module entirely.

There might be other answers - but the easiest and IMHO best is to
simply restart the interpreter. Because whatever you type in there, you
could or should even (if it reaches some complexity) put in a small test
script - and execute that from the interpreter at a shell prompt. The
advantage is that you don't suffer from any side-effects e.g. IDLE has
(no Tk mainloop for example) and avoid the problems you describe
entirely. Together with a bunch of others.

If you want/have to, you can drop into interpreter mode after script
execution with

python -i myscript.py

Diez

Jun 1 '07 #4

P: n/a
ai
Perhaps you misundstand me. I means if you reedit a module file and
reload it, the interpreter doesn't follow the change you have made
exactly.
For example, you import a module, edit the module file (you may
remove a global variable or change its name), save the change, reload
the module (or del the module and import it again). At last, you will
find the origin variable still exists in the interpreter.
If you don't notice this, you may meet some strange problems when you
do refacting.
On Jun 1, 12:17 am, Maric Michaud <m...@aristote.infowrote:
ai a écrit :
It assumes that there is a module A which have two global variables X
and Y. If I run "import A" in the IDLE shell, then I can use A.X and
A.Y correctly. But if I want to change the module A and then delete
the variable Y, I find I can use A.Y just the same as before!

It's unlikely to be true, see below.
In fact, I have tried all the following methods but can't remove the
A.Y:
execute "import A" again
"reload(A)"
"del A; import A"
Yes, if you use "del A.Y", it works. But it is stupid since there are
probably many names. In my thought, if no one references objects in A,
"del A" will release all memory about A. But it seems that the fact is
not. So I can not refresh the namespace to follow changes of a module
easily and I will worry about the memory if I del a module.
I want to know if there is a way to clear a module entirely.

Actually I do not see your problem and your exact need, when I type the
following in python prompt I just see expected behavior, what is a
problem to you ? Maybe you could post a code explaining it.

In [64]: import a

In [65]: a.X

Out[65]: 0

In [66]: a.X = 2

In [67]: del a

In [68]: import a as b

In [69]: b.X

Out[69]: 2

In [71]: for name in [ n for n in b.__dict__ if not n.startswith('__') ]
:
....: b.__dict__.__delitem__(name)

....:

....:

In [72]: b.X

---------------------------------------------------------------------------

<type 'exceptions.AttributeError' Traceback (most recent call
last)

C:\Documents and Settings\maric\Bureau\<ipython consolein <module>()

<type 'exceptions.AttributeError'>: 'module' object has no attribute 'X'

In [73]: reload(b)

Out[73]: <module 'a' from 'a.pyc'>

In [74]: b.X

Out[74]: 0

In [75]: del b.X

In [76]: del b

In [77]: import a

In [78]: a.b

---------------------------------------------------------------------------

<type 'exceptions.AttributeError' Traceback (most recent call
last)

C:\Documents and Settings\maric\Bureau\<ipython consolein <module>()

<type 'exceptions.AttributeError'>: 'module' object has no attribute 'b'

Jun 1 '07 #5

P: n/a
ai wrote:
Yes, you are right.
But from this problem, could I infer that the statement "del xxx"
doesn't release the memory which xxx used?
It just removes the name xxx from the current scope - which will result in a
reference counter decrease. If that was the last reference, the object will
be destroyed. Most times. There are some special cases involving the usage
of __del__-methods on objects.

Diez
Jun 1 '07 #6

P: n/a
ai
thx

On Jun 1, 6:50 pm, "Diez B. Roggisch" <d...@nospam.web.dewrote:
ai wrote:
Yes, you are right.
But from this problem, could I infer that the statement "del xxx"
doesn't release the memory which xxx used?

It just removes the name xxx from the current scope - which will result in a
reference counter decrease. If that was the last reference, the object will
be destroyed. Most times. There are some special cases involving the usage
of __del__-methods on objects.

Diez

Jun 1 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.