deleting, then re-importing a class method

Peter Otten __peter__ at web.de
Thu Jan 21 05:51:01 EST 2010


Robert P. J. Day wrote:

> 
>   (once again, never ashamed to ask the dumb questions.)
> 
>   still playing with python3, and testing whether i can
> delete/unimport a specific method, then re-import it:
> 
>>>> import sys
>>>> print(sys.__doc__)
> ... blah blah blah ...
>>>> del(sys.__doc__)
>>>> print(sys.__doc__)
> module(name[, doc])
> 
> Create a module object.
> The name must be a string; the optional doc argument can have any
> type.
>>>>
> 
>   ok, now that i've deleted just that member of "sys", can i re-import
> it?  i know this doesn't seem to work:

Actually you haven't:

>>> import sys
>>> del sys.__doc__
>>> hasattr(sys, "__doc__")
True

> 
>>>> import sys
> 
>   or is there an operator other than "import" that more represents a
> full refresh of a class?

imp.reload()

> rday
> 
> p.s.  no, i don't have a valid application of the above, i'm just
> trying to break things.

That is indeed likely to happen:

Python 3.1.1+ (r311:74480, Nov  2 2009, 15:45:00)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> walk = os.walk
>>> del os.walk
>>> hasattr(os, "walk")
False
>>> import imp
>>> imp.reload(os)
<module 'os' from '/usr/lib/python3.1/os.py'>
>>> os.walk
<function walk at 0x18c86b0>
>>> os.walk is walk
False

So you have to two distinct walk() functions now. This becomes especially 
nasty when

isinstance(obj, module.Class)

tests begin to fail because the module and the class was reloaded, but obj 
is an instance of module.Class before the reload.

Peter



More information about the Python-list mailing list