Reload after an exception, not possible ?
S.Mientki-nospam at mailbox.kun.nl
Wed Aug 1 11:04:22 CEST 2007
Steve Holden wrote:
> Stef Mientki wrote:
>> 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
>> 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
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:
9 import JAL_simulation_file
10 except JALsPy_globals.Reload_Exception:
11 JALsPy_globals.State = SS_Halt
More information about the Python-list