Proper way to reload a python module from the console
Question: I'm debugging from the python console and would like to reload a module every
time I make a change so I don't have to exit the console and re-enter it. I'm
doing:

    
    
    >>> from project.model.user import *
    >>> reload(user)
    

but I receive:

    
    
    >>>NameError: name 'user' is not defined
    

What is the proper way to reload the entire user class? Is there a better way
to do this, perhaps auto-updating while debugging?

Thanks.


Answer: As asked, the best you can do is

    
    
    >>> from project.models.user import *
    >>> import project # get module reference for reload
    >>> reload(project.models.user) # reload step 1
    >>> from project.models.user import * # reload step 2
    

it would be better and cleaner if you used the user module directly, rather
than doing `import *` (which is almost never the right way to do it). Then it
would just be

    
    
    >>> from project.models import user
    >>> reload(user)
    

This would do what you want. But, it's not very nice. If you really need to
reload modules so often, I've got to ask: why?

My suspicion (backed up by previous experience with people asking similar
questions) is that you're testing your module. There are lots of ways to test
a module out, and doing it by hand in the interactive interpreter is among the
worst ways. Save one of your sessions to a file and use
[`doctest`](http://docs.python.org/library/doctest.html), for a quick fix.
Alternatively, write it out as a program and use `python -i`. The only really
great solution, though, is using the
[`unittest`](http://docs.python.org/library/unittest.html) module.

If that's not it, hopefully it's something better, not worse. There's really
no good use of `reload` (in fact, it's removed in 3.x). It doesn't work
effectively-- you might reload a module but leave leftovers from previous
versions. It doesn't even work on all kinds of modules-- extension modules
will not reload properly, or sometimes even break horribly, when reloaded.

The context of using it in the interactive interpreter doesn't leave a lot of
choices as to what you are doing, and what the real best solution would be.
Outside it, sometimes people used `reload()` to implement plugins etc. This is
dangerous at best, and can frequently be done differently using either `exec`
(ah the evil territory we find ourselves in), or a segregated process.

