forked from jamesgao/ipython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisplay_trap.py
More file actions
100 lines (73 loc) · 3.06 KB
/
display_trap.py
File metadata and controls
100 lines (73 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# 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