# encoding: utf-8 """ A context manager for handling sys.displayhook. Authors: * Robert Kern * Brian Granger """ #----------------------------------------------------------------------------- # Copyright (C) 2008-2009 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import sys from IPython.config.configurable import Configurable from IPython.utils.traitlets import Any #----------------------------------------------------------------------------- # Classes and functions #----------------------------------------------------------------------------- class DisplayTrap(Configurable): """Object to manage sys.displayhook. This came from IPython.core.kernel.display_hook, but is simplified (no callbacks or formatters) until more of the core is refactored. """ hook = Any def __init__(self, hook=None): super(DisplayTrap, self).__init__(hook=hook, config=None) self.old_hook = None # We define this to track if a single BuiltinTrap is nested. # Only turn off the trap when the outermost call to __exit__ is made. self._nested_level = 0 def __enter__(self): if self._nested_level == 0: self.set() self._nested_level += 1 return self def __exit__(self, type, value, traceback): if self._nested_level == 1: self.unset() self._nested_level -= 1 # Returning False will cause exceptions to propagate return False def set(self): """Set the hook.""" if sys.displayhook is not self.hook: self.old_hook = sys.displayhook sys.displayhook = self.hook def unset(self): """Unset the hook.""" sys.displayhook = self.old_hook