#!/usr/bin/env python # 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.core.component import Component from IPython.utils.autoattr import auto_attr #----------------------------------------------------------------------------- # Classes and functions #----------------------------------------------------------------------------- class DisplayTrap(Component): """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. """ def __init__(self, parent, hook): super(DisplayTrap, self).__init__(parent, None, None) self.hook = hook 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 @auto_attr def shell(self): return Component.get_instances( root=self.root, klass='IPython.core.iplib.InteractiveShell')[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