display_trap.py
100 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
Brian E Granger
|
r1234 | # encoding: utf-8 | ||
"""Manager for replacing sys.displayhook().""" | ||||
__docformat__ = "restructuredtext en" | ||||
#------------------------------------------------------------------------------- | ||||
# Copyright (C) 2008 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 | ||||
#------------------------------------------------------------------------------- | ||||
# Standard library imports. | ||||
import sys | ||||
class DisplayTrap(object): | ||||
""" Object to trap and format objects passing through sys.displayhook(). | ||||
This trap maintains two lists of callables: formatters and callbacks. The | ||||
formatters take the *last* object that has gone through since the trap was | ||||
set and returns a string representation. Callbacks are executed on *every* | ||||
object that passes through the displayhook and does not return anything. | ||||
""" | ||||
def __init__(self, formatters=None, callbacks=None): | ||||
# A list of formatters to apply. Each should be an instance conforming | ||||
# to the IDisplayFormatter interface. | ||||
if formatters is None: | ||||
formatters = [] | ||||
self.formatters = formatters | ||||
# A list of callables, each of which should be executed *every* time an | ||||
# object passes through sys.displayhook(). | ||||
if callbacks is None: | ||||
callbacks = [] | ||||
self.callbacks = callbacks | ||||
# The last object to pass through the displayhook. | ||||
self.obj = None | ||||
# The previous hook before we replace it. | ||||
self.old_hook = None | ||||
def hook(self, obj): | ||||
""" This method actually implements the hook. | ||||
""" | ||||
# Run through the list of callbacks and trigger all of them. | ||||
for callback in self.callbacks: | ||||
callback(obj) | ||||
# Store the object for formatting. | ||||
self.obj = obj | ||||
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 | ||||
def clear(self): | ||||
""" Reset the stored object. | ||||
""" | ||||
self.obj = None | ||||
def add_to_message(self, message): | ||||
""" Add the formatted display of the objects to the message dictionary | ||||
being returned from the interpreter to its listeners. | ||||
""" | ||||
# If there was no displayed object (or simply None), then don't add | ||||
# anything. | ||||
if self.obj is None: | ||||
return | ||||
# Go through the list of formatters and let them add their formatting. | ||||
display = {} | ||||
for formatter in self.formatters: | ||||
representation = formatter(self.obj) | ||||
if representation is not None: | ||||
display[formatter.identifier] = representation | ||||
message['display'] = display | ||||