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 |
|
|
|
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