[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/