Links

Lists

Latest Updates

Ruby On Rails List
Python list
Advanced Java
The JavaScript List
Apache Users
Full Disclosure
Linux Security

Search the archives!


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Reload after an exception, not possible ?


  • From: steve at holdenweb.com (Steve Holden)
  • Subject: Reload after an exception, not possible ?
  • Date: Tue, 31 Jul 2007 22:51:46 -0400

Stef Mientki wrote:
> hello,
> 
> I've a graphical application (wxPython),
> where the code in the main GUI loop is given below.
> 
> 
> 1    JAL_Loaded = False
> 2    while len(App_Running) > 0:
> 3        if JALsPy_globals.State == SS_Run:
> 4            try:
> 5                if JAL_Loaded:
> 6                    reload ( JAL_simulation_file )
> 7                else:
> 8                    JAL_Loaded = True
> 9                    import JAL_simulation_file
> 10           except JALsPy_globals.Reload_Exception:
> 11               JALsPy_globals.State = SS_Halt
> 
> 
> The first time the while loop is entered,
> JAL_Loaded is False (line 1),
> and when I press some button,
> the code will enter at line 8,
> importing a module, that has executable code with an infinite loop.
> 
> To exit this infinite loop, an exception is generated (by a button press),
> and program comes back in the above while-loop line (10,11,2).
> 
> So far so good.
> 
> Then I change the code in the imported file,
> and when I start the engine again,
> the flag JAL_Loaded is True, so I don't import,
> but I reload the file.
> 
> Now I get the next exception
>    UnboundLocalError: local variable 'JAL_simulation_file' referenced before assignment
> 
> So obviously I can't reload but have to do an import again
> (which makes the code much simpler ;-)
> but I don't understand why the reload raises an exception ????
> 
You have an assignment to JAL_simulation_file elsewhere inside the same 
function, later in the code. This means that Python will assume that it 
is local to the function, but the import statement will affect the 
module namespace rather than the function namespace.

In other words, your code is roughly equivalent to what follows, with 
the added complexity that the illegal reference isn't triggered until 
the second iteration of a loop.

 >>> def f():
...   print os
...   import os
...   os = "Something"
...
 >>> f()
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "<stdin>", line 2, in f
UnboundLocalError: local variable 'os' referenced before assignment
 >>>

The solution? Don't assign to JAL_simulation_file, and the function will 
use the local instead.

regards
  Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC/Ltd           http://www.holdenweb.com
Skype: holdenweb      http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------