##// END OF EJS Templates
update formatting as per PR tests
Peter Corke -
Show More
@@ -1,1027 +1,1028 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Display formatters.
3 3
4 4 Inheritance diagram:
5 5
6 6 .. inheritance-diagram:: IPython.core.formatters
7 7 :parts: 3
8 8 """
9 9
10 10 # Copyright (c) IPython Development Team.
11 11 # Distributed under the terms of the Modified BSD License.
12 12
13 13 import abc
14 14 import json
15 15 import sys
16 16 import traceback
17 17 import warnings
18 18 from io import StringIO
19 19
20 20 from decorator import decorator
21 21
22 22 from traitlets.config.configurable import Configurable
23 23 from .getipython import get_ipython
24 24 from ..utils.sentinel import Sentinel
25 25 from ..utils.dir2 import get_real_method
26 26 from ..lib import pretty
27 27 from traitlets import (
28 28 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
29 29 ForwardDeclaredInstance,
30 30 default, observe,
31 31 )
32 32
33 33
34 34 class DisplayFormatter(Configurable):
35 35
36 36 active_types = List(Unicode(),
37 37 help="""List of currently active mime-types to display.
38 38 You can use this to set a white-list for formats to display.
39 39
40 40 Most users will not need to change this value.
41 41 """).tag(config=True)
42 42
43 43 @default('active_types')
44 44 def _active_types_default(self):
45 45 return self.format_types
46 46
47 47 @observe('active_types')
48 48 def _active_types_changed(self, change):
49 49 for key, formatter in self.formatters.items():
50 50 if key in change['new']:
51 51 formatter.enabled = True
52 52 else:
53 53 formatter.enabled = False
54 54
55 55 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
56 56 @default('ipython_display_formatter')
57 57 def _default_formatter(self):
58 58 return IPythonDisplayFormatter(parent=self)
59 59
60 60 mimebundle_formatter = ForwardDeclaredInstance('FormatterABC')
61 61 @default('mimebundle_formatter')
62 62 def _default_mime_formatter(self):
63 63 return MimeBundleFormatter(parent=self)
64 64
65 65 # A dict of formatter whose keys are format types (MIME types) and whose
66 66 # values are subclasses of BaseFormatter.
67 67 formatters = Dict()
68 68 @default('formatters')
69 69 def _formatters_default(self):
70 70 """Activate the default formatters."""
71 71 formatter_classes = [
72 72 PlainTextFormatter,
73 73 HTMLFormatter,
74 74 MarkdownFormatter,
75 75 SVGFormatter,
76 76 PNGFormatter,
77 77 PDFFormatter,
78 78 JPEGFormatter,
79 79 LatexFormatter,
80 80 JSONFormatter,
81 81 JavascriptFormatter
82 82 ]
83 83 d = {}
84 84 for cls in formatter_classes:
85 85 f = cls(parent=self)
86 86 d[f.format_type] = f
87 87 return d
88 88
89 89 def format(self, obj, include=None, exclude=None):
90 90 """Return a format data dict for an object.
91 91
92 92 By default all format types will be computed.
93 93
94 94 The following MIME types are usually implemented:
95 95
96 96 * text/plain
97 97 * text/html
98 98 * text/markdown
99 99 * text/latex
100 100 * application/json
101 101 * application/javascript
102 102 * application/pdf
103 103 * image/png
104 104 * image/jpeg
105 105 * image/svg+xml
106 106
107 107 Parameters
108 108 ----------
109 109 obj : object
110 110 The Python object whose format data will be computed.
111 111 include : list, tuple or set; optional
112 112 A list of format type strings (MIME types) to include in the
113 113 format data dict. If this is set *only* the format types included
114 114 in this list will be computed.
115 115 exclude : list, tuple or set; optional
116 116 A list of format type string (MIME types) to exclude in the format
117 117 data dict. If this is set all format types will be computed,
118 118 except for those included in this argument.
119 119 Mimetypes present in exclude will take precedence over the ones in include
120 120
121 121 Returns
122 122 -------
123 123 (format_dict, metadata_dict) : tuple of two dicts
124 124
125 125 format_dict is a dictionary of key/value pairs, one of each format that was
126 126 generated for the object. The keys are the format types, which
127 127 will usually be MIME type strings and the values and JSON'able
128 128 data structure containing the raw data for the representation in
129 129 that format.
130 130
131 131 metadata_dict is a dictionary of metadata about each mime-type output.
132 132 Its keys will be a strict subset of the keys in format_dict.
133 133
134 134 Notes
135 135 -----
136 136
137 137 If an object implement `_repr_mimebundle_` as well as various
138 138 `_repr_*_`, the data returned by `_repr_mimebundle_` will take
139 139 precedence and the corresponding `_repr_*_` for this mimetype will
140 140 not be called.
141 141
142 142 """
143 143 format_dict = {}
144 144 md_dict = {}
145 145
146 146 if self.ipython_display_formatter(obj):
147 147 # object handled itself, don't proceed
148 148 return {}, {}
149 149
150 150 format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude)
151 151
152 152 if format_dict or md_dict:
153 153 if include:
154 154 format_dict = {k:v for k,v in format_dict.items() if k in include}
155 155 md_dict = {k:v for k,v in md_dict.items() if k in include}
156 156 if exclude:
157 157 format_dict = {k:v for k,v in format_dict.items() if k not in exclude}
158 158 md_dict = {k:v for k,v in md_dict.items() if k not in exclude}
159 159
160 160 for format_type, formatter in self.formatters.items():
161 161 if format_type in format_dict:
162 162 # already got it from mimebundle, maybe don't render again.
163 163 # exception: manually registered per-mime renderer
164 164 # check priority:
165 165 # 1. user-registered per-mime formatter
166 166 # 2. mime-bundle (user-registered or repr method)
167 167 # 3. default per-mime formatter (e.g. repr method)
168 168 try:
169 169 formatter.lookup(obj)
170 170 except KeyError:
171 171 # no special formatter, use mime-bundle-provided value
172 172 continue
173 173 if include and format_type not in include:
174 174 continue
175 175 if exclude and format_type in exclude:
176 176 continue
177 177
178 178 md = None
179 179 try:
180 180 data = formatter(obj)
181 181 except:
182 182 # FIXME: log the exception
183 183 raise
184 184
185 185 # formatters can return raw data or (data, metadata)
186 186 if isinstance(data, tuple) and len(data) == 2:
187 187 data, md = data
188 188
189 189 if data is not None:
190 190 format_dict[format_type] = data
191 191 if md is not None:
192 192 md_dict[format_type] = md
193 193 return format_dict, md_dict
194 194
195 195 @property
196 196 def format_types(self):
197 197 """Return the format types (MIME types) of the active formatters."""
198 198 return list(self.formatters.keys())
199 199
200 200
201 201 #-----------------------------------------------------------------------------
202 202 # Formatters for specific format types (text, html, svg, etc.)
203 203 #-----------------------------------------------------------------------------
204 204
205 205
206 206 def _safe_repr(obj):
207 207 """Try to return a repr of an object
208 208
209 209 always returns a string, at least.
210 210 """
211 211 try:
212 212 return repr(obj)
213 213 except Exception as e:
214 214 return "un-repr-able object (%r)" % e
215 215
216 216
217 217 class FormatterWarning(UserWarning):
218 218 """Warning class for errors in formatters"""
219 219
220 220 @decorator
221 221 def catch_format_error(method, self, *args, **kwargs):
222 222 """show traceback on failed format call"""
223 223 try:
224 224 r = method(self, *args, **kwargs)
225 225 except NotImplementedError:
226 226 # don't warn on NotImplementedErrors
227 227 return self._check_return(None, args[0])
228 228 except Exception:
229 229 exc_info = sys.exc_info()
230 230 ip = get_ipython()
231 231 if ip is not None:
232 232 ip.showtraceback(exc_info)
233 233 else:
234 234 traceback.print_exception(*exc_info)
235 235 return self._check_return(None, args[0])
236 236 return self._check_return(r, args[0])
237 237
238 238
239 239 class FormatterABC(metaclass=abc.ABCMeta):
240 240 """ Abstract base class for Formatters.
241 241
242 242 A formatter is a callable class that is responsible for computing the
243 243 raw format data for a particular format type (MIME type). For example,
244 244 an HTML formatter would have a format type of `text/html` and would return
245 245 the HTML representation of the object when called.
246 246 """
247 247
248 248 # The format type of the data returned, usually a MIME type.
249 249 format_type = 'text/plain'
250 250
251 251 # Is the formatter enabled...
252 252 enabled = True
253 253
254 254 @abc.abstractmethod
255 255 def __call__(self, obj):
256 256 """Return a JSON'able representation of the object.
257 257
258 258 If the object cannot be formatted by this formatter,
259 259 warn and return None.
260 260 """
261 261 return repr(obj)
262 262
263 263
264 264 def _mod_name_key(typ):
265 265 """Return a (__module__, __name__) tuple for a type.
266 266
267 267 Used as key in Formatter.deferred_printers.
268 268 """
269 269 module = getattr(typ, '__module__', None)
270 270 name = getattr(typ, '__name__', None)
271 271 return (module, name)
272 272
273 273
274 274 def _get_type(obj):
275 275 """Return the type of an instance (old and new-style)"""
276 276 return getattr(obj, '__class__', None) or type(obj)
277 277
278 278
279 279 _raise_key_error = Sentinel('_raise_key_error', __name__,
280 280 """
281 281 Special value to raise a KeyError
282 282
283 283 Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop`
284 284 """)
285 285
286 286
287 287 class BaseFormatter(Configurable):
288 288 """A base formatter class that is configurable.
289 289
290 290 This formatter should usually be used as the base class of all formatters.
291 291 It is a traited :class:`Configurable` class and includes an extensible
292 292 API for users to determine how their objects are formatted. The following
293 293 logic is used to find a function to format an given object.
294 294
295 295 1. The object is introspected to see if it has a method with the name
296 296 :attr:`print_method`. If is does, that object is passed to that method
297 297 for formatting.
298 298 2. If no print method is found, three internal dictionaries are consulted
299 299 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
300 300 and :attr:`deferred_printers`.
301 301
302 302 Users should use these dictionaries to register functions that will be
303 303 used to compute the format data for their objects (if those objects don't
304 304 have the special print methods). The easiest way of using these
305 305 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
306 306 methods.
307 307
308 308 If no function/callable is found to compute the format data, ``None`` is
309 309 returned and this format type is not used.
310 310 """
311 311
312 312 format_type = Unicode('text/plain')
313 313 _return_type = str
314 314
315 315 enabled = Bool(True).tag(config=True)
316 316
317 317 print_method = ObjectName('__repr__')
318 318
319 319 # The singleton printers.
320 320 # Maps the IDs of the builtin singleton objects to the format functions.
321 321 singleton_printers = Dict().tag(config=True)
322 322
323 323 # The type-specific printers.
324 324 # Map type objects to the format functions.
325 325 type_printers = Dict().tag(config=True)
326 326
327 327 # The deferred-import type-specific printers.
328 328 # Map (modulename, classname) pairs to the format functions.
329 329 deferred_printers = Dict().tag(config=True)
330 330
331 331 @catch_format_error
332 332 def __call__(self, obj):
333 333 """Compute the format for an object."""
334 334 if self.enabled:
335 335 # lookup registered printer
336 336 try:
337 337 printer = self.lookup(obj)
338 338 except KeyError:
339 339 pass
340 340 else:
341 341 return printer(obj)
342 342 # Finally look for special method names
343 343 method = get_real_method(obj, self.print_method)
344 344 if method is not None:
345 345 return method()
346 346 return None
347 347 else:
348 348 return None
349 349
350 350 def __contains__(self, typ):
351 351 """map in to lookup_by_type"""
352 352 try:
353 353 self.lookup_by_type(typ)
354 354 except KeyError:
355 355 return False
356 356 else:
357 357 return True
358 358
359 359 def _check_return(self, r, obj):
360 360 """Check that a return value is appropriate
361 361
362 362 Return the value if so, None otherwise, warning if invalid.
363 363 """
364 364 if r is None or isinstance(r, self._return_type) or \
365 365 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
366 366 return r
367 367 else:
368 368 warnings.warn(
369 369 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
370 370 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
371 371 FormatterWarning
372 372 )
373 373
374 374 def lookup(self, obj):
375 375 """Look up the formatter for a given instance.
376 376
377 377 Parameters
378 378 ----------
379 379 obj : object instance
380 380
381 381 Returns
382 382 -------
383 383 f : callable
384 384 The registered formatting callable for the type.
385 385
386 386 Raises
387 387 ------
388 388 KeyError if the type has not been registered.
389 389 """
390 390 # look for singleton first
391 391 obj_id = id(obj)
392 392 if obj_id in self.singleton_printers:
393 393 return self.singleton_printers[obj_id]
394 394 # then lookup by type
395 395 return self.lookup_by_type(_get_type(obj))
396 396
397 397 def lookup_by_type(self, typ):
398 398 """Look up the registered formatter for a type.
399 399
400 400 Parameters
401 401 ----------
402 402 typ : type or '__module__.__name__' string for a type
403 403
404 404 Returns
405 405 -------
406 406 f : callable
407 407 The registered formatting callable for the type.
408 408
409 409 Raises
410 410 ------
411 411 KeyError if the type has not been registered.
412 412 """
413 413 if isinstance(typ, str):
414 414 typ_key = tuple(typ.rsplit('.',1))
415 415 if typ_key not in self.deferred_printers:
416 416 # We may have it cached in the type map. We will have to
417 417 # iterate over all of the types to check.
418 418 for cls in self.type_printers:
419 419 if _mod_name_key(cls) == typ_key:
420 420 return self.type_printers[cls]
421 421 else:
422 422 return self.deferred_printers[typ_key]
423 423 else:
424 424 for cls in pretty._get_mro(typ):
425 425 if cls in self.type_printers or self._in_deferred_types(cls):
426 426 return self.type_printers[cls]
427 427
428 428 # If we have reached here, the lookup failed.
429 429 raise KeyError("No registered printer for {0!r}".format(typ))
430 430
431 431 def for_type(self, typ, func=None):
432 432 """Add a format function for a given type.
433 433
434 434 Parameters
435 435 ----------
436 436 typ : type or '__module__.__name__' string for a type
437 437 The class of the object that will be formatted using `func`.
438 438 func : callable
439 439 A callable for computing the format data.
440 440 `func` will be called with the object to be formatted,
441 441 and will return the raw data in this formatter's format.
442 442 Subclasses may use a different call signature for the
443 443 `func` argument.
444 444
445 445 If `func` is None or not specified, there will be no change,
446 446 only returning the current value.
447 447
448 448 Returns
449 449 -------
450 450 oldfunc : callable
451 451 The currently registered callable.
452 452 If you are registering a new formatter,
453 453 this will be the previous value (to enable restoring later).
454 454 """
455 455 # if string given, interpret as 'pkg.module.class_name'
456 456 if isinstance(typ, str):
457 457 type_module, type_name = typ.rsplit('.', 1)
458 458 return self.for_type_by_name(type_module, type_name, func)
459 459
460 460 try:
461 461 oldfunc = self.lookup_by_type(typ)
462 462 except KeyError:
463 463 oldfunc = None
464 464
465 465 if func is not None:
466 466 self.type_printers[typ] = func
467 467
468 468 return oldfunc
469 469
470 470 def for_type_by_name(self, type_module, type_name, func=None):
471 471 """Add a format function for a type specified by the full dotted
472 472 module and name of the type, rather than the type of the object.
473 473
474 474 Parameters
475 475 ----------
476 476 type_module : str
477 477 The full dotted name of the module the type is defined in, like
478 478 ``numpy``.
479 479 type_name : str
480 480 The name of the type (the class name), like ``dtype``
481 481 func : callable
482 482 A callable for computing the format data.
483 483 `func` will be called with the object to be formatted,
484 484 and will return the raw data in this formatter's format.
485 485 Subclasses may use a different call signature for the
486 486 `func` argument.
487 487
488 488 If `func` is None or unspecified, there will be no change,
489 489 only returning the current value.
490 490
491 491 Returns
492 492 -------
493 493 oldfunc : callable
494 494 The currently registered callable.
495 495 If you are registering a new formatter,
496 496 this will be the previous value (to enable restoring later).
497 497 """
498 498 key = (type_module, type_name)
499 499
500 500 try:
501 501 oldfunc = self.lookup_by_type("%s.%s" % key)
502 502 except KeyError:
503 503 oldfunc = None
504 504
505 505 if func is not None:
506 506 self.deferred_printers[key] = func
507 507 return oldfunc
508 508
509 509 def pop(self, typ, default=_raise_key_error):
510 510 """Pop a formatter for the given type.
511 511
512 512 Parameters
513 513 ----------
514 514 typ : type or '__module__.__name__' string for a type
515 515 default : object
516 516 value to be returned if no formatter is registered for typ.
517 517
518 518 Returns
519 519 -------
520 520 obj : object
521 521 The last registered object for the type.
522 522
523 523 Raises
524 524 ------
525 525 KeyError if the type is not registered and default is not specified.
526 526 """
527 527
528 528 if isinstance(typ, str):
529 529 typ_key = tuple(typ.rsplit('.',1))
530 530 if typ_key not in self.deferred_printers:
531 531 # We may have it cached in the type map. We will have to
532 532 # iterate over all of the types to check.
533 533 for cls in self.type_printers:
534 534 if _mod_name_key(cls) == typ_key:
535 535 old = self.type_printers.pop(cls)
536 536 break
537 537 else:
538 538 old = default
539 539 else:
540 540 old = self.deferred_printers.pop(typ_key)
541 541 else:
542 542 if typ in self.type_printers:
543 543 old = self.type_printers.pop(typ)
544 544 else:
545 545 old = self.deferred_printers.pop(_mod_name_key(typ), default)
546 546 if old is _raise_key_error:
547 547 raise KeyError("No registered value for {0!r}".format(typ))
548 548 return old
549 549
550 550 def _in_deferred_types(self, cls):
551 551 """
552 552 Check if the given class is specified in the deferred type registry.
553 553
554 554 Successful matches will be moved to the regular type registry for future use.
555 555 """
556 556 mod = getattr(cls, '__module__', None)
557 557 name = getattr(cls, '__name__', None)
558 558 key = (mod, name)
559 559 if key in self.deferred_printers:
560 560 # Move the printer over to the regular registry.
561 561 printer = self.deferred_printers.pop(key)
562 562 self.type_printers[cls] = printer
563 563 return True
564 564 return False
565 565
566 566
567 567 class PlainTextFormatter(BaseFormatter):
568 568 """The default pretty-printer.
569 569
570 570 This uses :mod:`IPython.lib.pretty` to compute the format data of
571 571 the object. If the object cannot be pretty printed, :func:`repr` is used.
572 572 See the documentation of :mod:`IPython.lib.pretty` for details on
573 573 how to write pretty printers. Here is a simple example::
574 574
575 575 def dtype_pprinter(obj, p, cycle):
576 576 if cycle:
577 577 return p.text('dtype(...)')
578 578 if hasattr(obj, 'fields'):
579 579 if obj.fields is None:
580 580 p.text(repr(obj))
581 581 else:
582 582 p.begin_group(7, 'dtype([')
583 583 for i, field in enumerate(obj.descr):
584 584 if i > 0:
585 585 p.text(',')
586 586 p.breakable()
587 587 p.pretty(field)
588 588 p.end_group(7, '])')
589 589 """
590 590
591 591 # The format type of data returned.
592 592 format_type = Unicode('text/plain')
593 593
594 594 # This subclass ignores this attribute as it always need to return
595 595 # something.
596 596 enabled = Bool(True).tag(config=False)
597 597
598 598 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH,
599 599 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
600 600
601 601 Set to 0 to disable truncation.
602 602 """
603 603 ).tag(config=True)
604 604
605 605 # Look for a _repr_pretty_ methods to use for pretty printing.
606 606 print_method = ObjectName('_repr_pretty_')
607 607
608 608 # Whether to pretty-print or not.
609 609 pprint = Bool(True).tag(config=True)
610 610
611 611 # Whether to be verbose or not.
612 612 verbose = Bool(False).tag(config=True)
613 613
614 614 # The maximum width.
615 615 max_width = Integer(79).tag(config=True)
616 616
617 617 # The newline character.
618 618 newline = Unicode('\n').tag(config=True)
619 619
620 620 # format-string for pprinting floats
621 621 float_format = Unicode('%r')
622 622 # setter for float precision, either int or direct format-string
623 623 float_precision = CUnicode('').tag(config=True)
624 624
625 625 @observe('float_precision')
626 626 def _float_precision_changed(self, change):
627 627 """float_precision changed, set float_format accordingly.
628 628
629 629 float_precision can be set by int or str.
630 630 This will set float_format, after interpreting input.
631 631 If numpy has been imported, numpy print precision will also be set.
632 632
633 633 integer `n` sets format to '%.nf', otherwise, format set directly.
634 634
635 635 An empty string returns to defaults (repr for float, 8 for numpy).
636 636
637 637 This parameter can be set via the '%precision' magic.
638 638 """
639 639 new = change['new']
640 640 if '%' in new:
641 641 # got explicit format string
642 642 fmt = new
643 643 try:
644 644 fmt%3.14159
645 645 except Exception as e:
646 646 raise ValueError("Precision must be int or format string, not %r"%new) from e
647 647 elif new:
648 648 # otherwise, should be an int
649 649 try:
650 650 i = int(new)
651 651 assert i >= 0
652 652 except ValueError as e:
653 653 raise ValueError("Precision must be int or format string, not %r"%new) from e
654 654 except AssertionError as e:
655 655 raise ValueError("int precision must be non-negative, not %r"%i) from e
656 656
657 657 fmt = '%%.%if'%i
658 658 if 'numpy' in sys.modules:
659 659 # set numpy precision if it has been imported
660 660 import numpy
661 661 numpy.set_printoptions(precision=i)
662 662 else:
663 663 # default back to repr
664 664 fmt = '%r'
665 665 if 'numpy' in sys.modules:
666 666 import numpy
667 667 # numpy default is 8
668 668 numpy.set_printoptions(precision=8)
669 669 self.float_format = fmt
670 670
671 671 # Use the default pretty printers from IPython.lib.pretty.
672 672 @default('singleton_printers')
673 673 def _singleton_printers_default(self):
674 674 return pretty._singleton_pprinters.copy()
675 675
676 676 @default('type_printers')
677 677 def _type_printers_default(self):
678 678 d = pretty._type_pprinters.copy()
679 679 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
680 680 # if NumPy is used, set precision for its float64 type
681 if 'numpy' in sys.modules:
681 if "numpy" in sys.modules:
682 682 import numpy
683 d[numpy.float64] = lambda obj,p,cycle: p.text(self.float_format%obj)
683
684 d[numpy.float64] = lambda obj, p, cycle: p.text(self.float_format % obj)
684 685 return d
685 686
686 687 @default('deferred_printers')
687 688 def _deferred_printers_default(self):
688 689 return pretty._deferred_type_pprinters.copy()
689 690
690 691 #### FormatterABC interface ####
691 692
692 693 @catch_format_error
693 694 def __call__(self, obj):
694 695 """Compute the pretty representation of the object."""
695 696 if not self.pprint:
696 697 return repr(obj)
697 698 else:
698 699 stream = StringIO()
699 700 printer = pretty.RepresentationPrinter(stream, self.verbose,
700 701 self.max_width, self.newline,
701 702 max_seq_length=self.max_seq_length,
702 703 singleton_pprinters=self.singleton_printers,
703 704 type_pprinters=self.type_printers,
704 705 deferred_pprinters=self.deferred_printers)
705 706 printer.pretty(obj)
706 707 printer.flush()
707 708 return stream.getvalue()
708 709
709 710
710 711 class HTMLFormatter(BaseFormatter):
711 712 """An HTML formatter.
712 713
713 714 To define the callables that compute the HTML representation of your
714 715 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
715 716 or :meth:`for_type_by_name` methods to register functions that handle
716 717 this.
717 718
718 719 The return value of this formatter should be a valid HTML snippet that
719 720 could be injected into an existing DOM. It should *not* include the
720 721 ```<html>`` or ```<body>`` tags.
721 722 """
722 723 format_type = Unicode('text/html')
723 724
724 725 print_method = ObjectName('_repr_html_')
725 726
726 727
727 728 class MarkdownFormatter(BaseFormatter):
728 729 """A Markdown formatter.
729 730
730 731 To define the callables that compute the Markdown representation of your
731 732 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
732 733 or :meth:`for_type_by_name` methods to register functions that handle
733 734 this.
734 735
735 736 The return value of this formatter should be a valid Markdown.
736 737 """
737 738 format_type = Unicode('text/markdown')
738 739
739 740 print_method = ObjectName('_repr_markdown_')
740 741
741 742 class SVGFormatter(BaseFormatter):
742 743 """An SVG formatter.
743 744
744 745 To define the callables that compute the SVG representation of your
745 746 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
746 747 or :meth:`for_type_by_name` methods to register functions that handle
747 748 this.
748 749
749 750 The return value of this formatter should be valid SVG enclosed in
750 751 ```<svg>``` tags, that could be injected into an existing DOM. It should
751 752 *not* include the ```<html>`` or ```<body>`` tags.
752 753 """
753 754 format_type = Unicode('image/svg+xml')
754 755
755 756 print_method = ObjectName('_repr_svg_')
756 757
757 758
758 759 class PNGFormatter(BaseFormatter):
759 760 """A PNG formatter.
760 761
761 762 To define the callables that compute the PNG representation of your
762 763 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
763 764 or :meth:`for_type_by_name` methods to register functions that handle
764 765 this.
765 766
766 767 The return value of this formatter should be raw PNG data, *not*
767 768 base64 encoded.
768 769 """
769 770 format_type = Unicode('image/png')
770 771
771 772 print_method = ObjectName('_repr_png_')
772 773
773 774 _return_type = (bytes, str)
774 775
775 776
776 777 class JPEGFormatter(BaseFormatter):
777 778 """A JPEG formatter.
778 779
779 780 To define the callables that compute the JPEG representation of your
780 781 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
781 782 or :meth:`for_type_by_name` methods to register functions that handle
782 783 this.
783 784
784 785 The return value of this formatter should be raw JPEG data, *not*
785 786 base64 encoded.
786 787 """
787 788 format_type = Unicode('image/jpeg')
788 789
789 790 print_method = ObjectName('_repr_jpeg_')
790 791
791 792 _return_type = (bytes, str)
792 793
793 794
794 795 class LatexFormatter(BaseFormatter):
795 796 """A LaTeX formatter.
796 797
797 798 To define the callables that compute the LaTeX representation of your
798 799 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
799 800 or :meth:`for_type_by_name` methods to register functions that handle
800 801 this.
801 802
802 803 The return value of this formatter should be a valid LaTeX equation,
803 804 enclosed in either ```$```, ```$$``` or another LaTeX equation
804 805 environment.
805 806 """
806 807 format_type = Unicode('text/latex')
807 808
808 809 print_method = ObjectName('_repr_latex_')
809 810
810 811
811 812 class JSONFormatter(BaseFormatter):
812 813 """A JSON string formatter.
813 814
814 815 To define the callables that compute the JSONable representation of
815 816 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
816 817 or :meth:`for_type_by_name` methods to register functions that handle
817 818 this.
818 819
819 820 The return value of this formatter should be a JSONable list or dict.
820 821 JSON scalars (None, number, string) are not allowed, only dict or list containers.
821 822 """
822 823 format_type = Unicode('application/json')
823 824 _return_type = (list, dict)
824 825
825 826 print_method = ObjectName('_repr_json_')
826 827
827 828 def _check_return(self, r, obj):
828 829 """Check that a return value is appropriate
829 830
830 831 Return the value if so, None otherwise, warning if invalid.
831 832 """
832 833 if r is None:
833 834 return
834 835 md = None
835 836 if isinstance(r, tuple):
836 837 # unpack data, metadata tuple for type checking on first element
837 838 r, md = r
838 839
839 840 # handle deprecated JSON-as-string form from IPython < 3
840 841 if isinstance(r, str):
841 842 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
842 843 FormatterWarning)
843 844 r = json.loads(r)
844 845
845 846 if md is not None:
846 847 # put the tuple back together
847 848 r = (r, md)
848 849 return super(JSONFormatter, self)._check_return(r, obj)
849 850
850 851
851 852 class JavascriptFormatter(BaseFormatter):
852 853 """A Javascript formatter.
853 854
854 855 To define the callables that compute the Javascript representation of
855 856 your objects, define a :meth:`_repr_javascript_` method or use the
856 857 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
857 858 that handle this.
858 859
859 860 The return value of this formatter should be valid Javascript code and
860 861 should *not* be enclosed in ```<script>``` tags.
861 862 """
862 863 format_type = Unicode('application/javascript')
863 864
864 865 print_method = ObjectName('_repr_javascript_')
865 866
866 867
867 868 class PDFFormatter(BaseFormatter):
868 869 """A PDF formatter.
869 870
870 871 To define the callables that compute the PDF representation of your
871 872 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
872 873 or :meth:`for_type_by_name` methods to register functions that handle
873 874 this.
874 875
875 876 The return value of this formatter should be raw PDF data, *not*
876 877 base64 encoded.
877 878 """
878 879 format_type = Unicode('application/pdf')
879 880
880 881 print_method = ObjectName('_repr_pdf_')
881 882
882 883 _return_type = (bytes, str)
883 884
884 885 class IPythonDisplayFormatter(BaseFormatter):
885 886 """An escape-hatch Formatter for objects that know how to display themselves.
886 887
887 888 To define the callables that compute the representation of your
888 889 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
889 890 or :meth:`for_type_by_name` methods to register functions that handle
890 891 this. Unlike mime-type displays, this method should not return anything,
891 892 instead calling any appropriate display methods itself.
892 893
893 894 This display formatter has highest priority.
894 895 If it fires, no other display formatter will be called.
895 896
896 897 Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types
897 898 without registering a new Formatter.
898 899
899 900 IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types,
900 901 so `_ipython_display_` should only be used for objects that require unusual
901 902 display patterns, such as multiple display calls.
902 903 """
903 904 print_method = ObjectName('_ipython_display_')
904 905 _return_type = (type(None), bool)
905 906
906 907 @catch_format_error
907 908 def __call__(self, obj):
908 909 """Compute the format for an object."""
909 910 if self.enabled:
910 911 # lookup registered printer
911 912 try:
912 913 printer = self.lookup(obj)
913 914 except KeyError:
914 915 pass
915 916 else:
916 917 printer(obj)
917 918 return True
918 919 # Finally look for special method names
919 920 method = get_real_method(obj, self.print_method)
920 921 if method is not None:
921 922 method()
922 923 return True
923 924
924 925
925 926 class MimeBundleFormatter(BaseFormatter):
926 927 """A Formatter for arbitrary mime-types.
927 928
928 929 Unlike other `_repr_<mimetype>_` methods,
929 930 `_repr_mimebundle_` should return mime-bundle data,
930 931 either the mime-keyed `data` dictionary or the tuple `(data, metadata)`.
931 932 Any mime-type is valid.
932 933
933 934 To define the callables that compute the mime-bundle representation of your
934 935 objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type`
935 936 or :meth:`for_type_by_name` methods to register functions that handle
936 937 this.
937 938
938 939 .. versionadded:: 6.1
939 940 """
940 941 print_method = ObjectName('_repr_mimebundle_')
941 942 _return_type = dict
942 943
943 944 def _check_return(self, r, obj):
944 945 r = super(MimeBundleFormatter, self)._check_return(r, obj)
945 946 # always return (data, metadata):
946 947 if r is None:
947 948 return {}, {}
948 949 if not isinstance(r, tuple):
949 950 return r, {}
950 951 return r
951 952
952 953 @catch_format_error
953 954 def __call__(self, obj, include=None, exclude=None):
954 955 """Compute the format for an object.
955 956
956 957 Identical to parent's method but we pass extra parameters to the method.
957 958
958 959 Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in
959 960 particular `include` and `exclude`.
960 961 """
961 962 if self.enabled:
962 963 # lookup registered printer
963 964 try:
964 965 printer = self.lookup(obj)
965 966 except KeyError:
966 967 pass
967 968 else:
968 969 return printer(obj)
969 970 # Finally look for special method names
970 971 method = get_real_method(obj, self.print_method)
971 972
972 973 if method is not None:
973 974 return method(include=include, exclude=exclude)
974 975 return None
975 976 else:
976 977 return None
977 978
978 979
979 980 FormatterABC.register(BaseFormatter)
980 981 FormatterABC.register(PlainTextFormatter)
981 982 FormatterABC.register(HTMLFormatter)
982 983 FormatterABC.register(MarkdownFormatter)
983 984 FormatterABC.register(SVGFormatter)
984 985 FormatterABC.register(PNGFormatter)
985 986 FormatterABC.register(PDFFormatter)
986 987 FormatterABC.register(JPEGFormatter)
987 988 FormatterABC.register(LatexFormatter)
988 989 FormatterABC.register(JSONFormatter)
989 990 FormatterABC.register(JavascriptFormatter)
990 991 FormatterABC.register(IPythonDisplayFormatter)
991 992 FormatterABC.register(MimeBundleFormatter)
992 993
993 994
994 995 def format_display_data(obj, include=None, exclude=None):
995 996 """Return a format data dict for an object.
996 997
997 998 By default all format types will be computed.
998 999
999 1000 Parameters
1000 1001 ----------
1001 1002 obj : object
1002 1003 The Python object whose format data will be computed.
1003 1004
1004 1005 Returns
1005 1006 -------
1006 1007 format_dict : dict
1007 1008 A dictionary of key/value pairs, one or each format that was
1008 1009 generated for the object. The keys are the format types, which
1009 1010 will usually be MIME type strings and the values and JSON'able
1010 1011 data structure containing the raw data for the representation in
1011 1012 that format.
1012 1013 include : list or tuple, optional
1013 1014 A list of format type strings (MIME types) to include in the
1014 1015 format data dict. If this is set *only* the format types included
1015 1016 in this list will be computed.
1016 1017 exclude : list or tuple, optional
1017 1018 A list of format type string (MIME types) to exclude in the format
1018 1019 data dict. If this is set all format types will be computed,
1019 1020 except for those included in this argument.
1020 1021 """
1021 1022 from .interactiveshell import InteractiveShell
1022 1023
1023 1024 return InteractiveShell.instance().display_formatter.format(
1024 1025 obj,
1025 1026 include,
1026 1027 exclude
1027 1028 )
General Comments 0
You need to be logged in to leave comments. Login now