# 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