Reload after an exception, not possible ?

Stef Mientki S.Mientki-nospam at mailbox.kun.nl
Wed Aug 1 11:04:22 CEST 2007


Steve Holden wrote:
> 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,
No these are the only 2 uses of "JAL_simulation_file" in the whole project.

  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.
> 

The solution is much simpler, but I don't understand why the "import",
which really reloads the changed code in JAL_simulation_file,
works the second time :-(

2    while len(App_Running) > 0:
3        if JALsPy_globals.State == SS_Run:
4            try:
9                import JAL_simulation_file
10           except JALsPy_globals.Reload_Exception:
11               JALsPy_globals.State = SS_Halt

cheers,
Stef Mientki



More information about the Python-list mailing list