##// END OF EJS Templates
add SelfDisplayingFormatter...
Min RK -
Show More
@@ -164,20 +164,13 b' def display(*objs, **kwargs):'
164 164 format = InteractiveShell.instance().display_formatter.format
165 165
166 166 for obj in objs:
167
168 # If _ipython_display_ is defined, use that to display this object.
169 display_method = _safe_get_formatter_method(obj, '_ipython_display_')
170 if display_method is not None:
171 try:
172 display_method(**kwargs)
173 except NotImplementedError:
174 pass
175 else:
176 continue
177 167 if raw:
178 168 publish_display_data(data=obj, metadata=metadata)
179 169 else:
180 170 format_dict, md_dict = format(obj, include=include, exclude=exclude)
171 if not format_dict:
172 # nothing to display (e.g. _ipython_display_ took over)
173 continue
181 174 if metadata:
182 175 # kwarg-specified metadata gets precedence
183 176 _merge(md_dict, metadata)
@@ -221,20 +221,13 b' class DisplayHook(Configurable):'
221 221 """
222 222 self.check_for_underscore()
223 223 if result is not None and not self.quiet():
224 # If _ipython_display_ is defined, use that to display this object.
225 display_method = _safe_get_formatter_method(result, '_ipython_display_')
226 if display_method is not None:
227 try:
228 return display_method()
229 except NotImplementedError:
230 pass
231
232 224 self.start_displayhook()
233 225 self.write_output_prompt()
234 226 format_dict, md_dict = self.compute_format_data(result)
235 self.write_format_data(format_dict, md_dict)
236 227 self.update_user_ns(result)
237 self.log_output(format_dict)
228 if format_dict:
229 self.write_format_data(format_dict, md_dict)
230 self.log_output(format_dict)
238 231 self.finish_displayhook()
239 232
240 233 def cull_cache(self):
@@ -24,6 +24,7 b' from IPython.core.getipython import get_ipython'
24 24 from IPython.lib import pretty
25 25 from IPython.utils.traitlets import (
26 26 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
27 Instance,
27 28 )
28 29 from IPython.utils.py3compat import (
29 30 unicode_to_str, with_metaclass, PY3, string_types, unicode_type,
@@ -89,6 +90,10 b' class DisplayFormatter(Configurable):'
89 90 else:
90 91 formatter.enabled = False
91 92
93 self_formatter = Instance(__name__ +'.SelfDisplayingFormatter')
94 def _self_formatter_default(self):
95 return SelfDisplayingFormatter(parent=self)
96
92 97 # A dict of formatter whose keys are format types (MIME types) and whose
93 98 # values are subclasses of BaseFormatter.
94 99 formatters = Dict()
@@ -158,7 +163,11 b' class DisplayFormatter(Configurable):'
158 163 """
159 164 format_dict = {}
160 165 md_dict = {}
161
166
167 if self.self_formatter(obj):
168 # object handled itself, don't proceed
169 return {}, {}
170
162 171 for format_type, formatter in self.formatters.items():
163 172 if include and format_type not in include:
164 173 continue
@@ -831,6 +840,40 b' class PDFFormatter(BaseFormatter):'
831 840
832 841 _return_type = (bytes, unicode_type)
833 842
843 class SelfDisplayingFormatter(BaseFormatter):
844 """A Formatter for objects that know how to display themselves.
845
846 To define the callables that compute the representation of your
847 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
848 or :meth:`for_type_by_name` methods to register functions that handle
849 this. Unlike mime-type displays, this method should not return anything,
850 instead calling any appropriate display methods itself.
851
852 This display formatter has highest priority.
853 If it fires, no other display formatter will be called.
854 """
855 print_method = ObjectName('_ipython_display_')
856 _return_type = (type(None), bool)
857
858
859 @warn_format_error
860 def __call__(self, obj):
861 """Compute the format for an object."""
862 if self.enabled:
863 # lookup registered printer
864 try:
865 printer = self.lookup(obj)
866 except KeyError:
867 pass
868 else:
869 printer(obj)
870 return True
871 # Finally look for special method names
872 method = _safe_get_formatter_method(obj, self.print_method)
873 if method is not None:
874 method()
875 return True
876
834 877
835 878 FormatterABC.register(BaseFormatter)
836 879 FormatterABC.register(PlainTextFormatter)
@@ -843,6 +886,7 b' FormatterABC.register(JPEGFormatter)'
843 886 FormatterABC.register(LatexFormatter)
844 887 FormatterABC.register(JSONFormatter)
845 888 FormatterABC.register(JavascriptFormatter)
889 FormatterABC.register(SelfDisplayingFormatter)
846 890
847 891
848 892 def format_display_data(obj, include=None, exclude=None):
General Comments 0
You need to be logged in to leave comments. Login now