display_trap.py
70 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2231 | # encoding: utf-8 | ||
""" | ||||
A context manager for handling sys.displayhook. | ||||
Authors: | ||||
* Robert Kern | ||||
* Brian Granger | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | ||
Brian Granger
|
r2231 | # | ||
# 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 | ||||
Brian Granger
|
r2731 | from IPython.config.configurable import Configurable | ||
Brian Granger
|
r2740 | from IPython.utils.traitlets import Any | ||
Brian Granger
|
r2231 | |||
#----------------------------------------------------------------------------- | ||||
# Classes and functions | ||||
#----------------------------------------------------------------------------- | ||||
Brian Granger
|
r2731 | class DisplayTrap(Configurable): | ||
Brian Granger
|
r2231 | """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. | ||||
""" | ||||
Brian Granger
|
r2740 | hook = Any | ||
def __init__(self, hook=None): | ||||
super(DisplayTrap, self).__init__(hook=hook, config=None) | ||||
Brian Granger
|
r2231 | self.old_hook = None | ||
Brian Granger
|
r2245 | # 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 | ||||
Brian Granger
|
r2231 | |||
def __enter__(self): | ||||
Brian Granger
|
r2245 | if self._nested_level == 0: | ||
self.set() | ||||
self._nested_level += 1 | ||||
Brian Granger
|
r2231 | return self | ||
def __exit__(self, type, value, traceback): | ||||
Brian Granger
|
r2245 | if self._nested_level == 1: | ||
self.unset() | ||||
self._nested_level -= 1 | ||||
Brian Granger
|
r2281 | # Returning False will cause exceptions to propagate | ||
return False | ||||
Brian Granger
|
r2231 | |||
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 | ||||