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/