[Python-Dev] Re: [Python-checkins] CVS: python/dist/src/Lib/curses __init__.py,NONE,1.1 wrapper.py,NONE,1.1
Greg Stein
gstein@lyra.org
Sat, 10 Jun 2000 16:30:13 -0700
On Sat, Jun 10, 2000 at 04:06:55PM -0700, A.M. Kuchling wrote:
>...
> def wrapper(func, *rest):
> """Wrapper function that initializes curses and calls another function,
> restoring normal keyboard/screen behavior on error.
> The callable object 'func' is then passed the main window 'stdscr'
> as its first argument, followed by any other arguments passed to
> wrapper().
> """
>
> res = None
> try:
> # Initialize curses
> stdscr=curses.initscr()
> # Turn off echoing of keys, and enter cbreak mode,
> # where no buffering is performed on keyboard input
> curses.noecho() ; curses.cbreak()
>
> # In keypad mode, escape sequences for special keys
> # (like the cursor keys) will be interpreted and
> # a special value like curses.KEY_LEFT will be returned
> stdscr.keypad(1)
>
> res = apply(func, (stdscr,) + rest)
> except:
> # In the event of an error, restore the terminal
> # to a sane state.
> stdscr.keypad(0)
> curses.echo() ; curses.nocbreak()
> curses.endwin()
> # Pass the exception upwards
> (exc_type, exc_value, exc_traceback) = sys.exc_info()
> raise exc_type, exc_value, exc_traceback
> else:
> # Set everything back to normal
> stdscr.keypad(0)
> curses.echo() ; curses.nocbreak()
> curses.endwin() # Terminate curses
>
> return res
This is too complicated. It should read:
...
return apply(func, (stdscr,) + rest)
finally:
# Set everything back to normal
stdscr.keypad(0)
curses.echo()
curses.nocbreak()
curses.endwin()
Andrew: can you make this change?
Separate from the above simplification, it is important to note:
exc_type, exc_value, exc_traceback = sys.exc_info()
raise exc_type, exc_value, exc_traceback
and
raise
are equivalent in (most) function. The difference is that the former places
the traceback into local variable storage (exc_traceback) which then
introduces a reference loop.
Whenever sys.exc_info() is used, it is very important to watch out for loops
caused by the traceback object. "del exc_traceback" is very handy :-)
Cheers,
-g
--
Greg Stein, http://www.lyra.org/