formatters.py
154 lines
| 4.5 KiB
| text/x-python
|
PythonLexer
Robert Kern
|
r3209 | # -*- coding: utf-8 -*- | ||
"""Displayhook formatters. | ||||
Robert Kern
|
r3212 | The DefaultFormatter is always present and may be configured from the | ||
ipython_config.py file. For example, to add a pretty-printer for a numpy.dtype | ||||
object:: | ||||
Robert Kern
|
r3211 | |||
def dtype_pprinter(obj, p, cycle): | ||||
if cycle: | ||||
return p.text('dtype(...)') | ||||
if hasattr(obj, 'fields'): | ||||
if obj.fields is None: | ||||
p.text(repr(obj)) | ||||
else: | ||||
p.begin_group(7, 'dtype([') | ||||
for i, field in enumerate(obj.descr): | ||||
if i > 0: | ||||
p.text(',') | ||||
p.breakable() | ||||
p.pretty(field) | ||||
p.end_group(7, '])') | ||||
c.DefaultFormatter.deferred_pprinters = { | ||||
('numpy', 'dtype'): dtype_pprinter, | ||||
} | ||||
The deferred_pprinters dictionary is the preferred way to configure these | ||||
pretty-printers. This allows you to define the pretty-printer without needing to | ||||
import the type itself. The dictionary maps (modulename, typename) pairs to | ||||
a function. | ||||
See the `IPython.external.pretty` documentation for how to write | ||||
pretty-printer functions. | ||||
Robert Kern
|
r3209 | Authors: | ||
* Robert Kern | ||||
""" | ||||
import abc | ||||
from cStringIO import StringIO | ||||
from IPython.config.configurable import Configurable | ||||
from IPython.external import pretty | ||||
from IPython.utils.traitlets import Bool, Dict, Int, Str | ||||
class DefaultFormatter(Configurable): | ||||
""" The default pretty-printer. | ||||
""" | ||||
# The ID of the formatter. | ||||
id = Str('default') | ||||
# The kind of data returned. | ||||
format = Str('text') | ||||
# Whether to pretty-print or not. | ||||
Robert Kern
|
r3210 | pprint = Bool(True, config=True) | ||
Robert Kern
|
r3209 | |||
# Whether to be verbose or not. | ||||
Robert Kern
|
r3210 | verbose = Bool(False, config=True) | ||
Robert Kern
|
r3209 | |||
# The maximum width. | ||||
Robert Kern
|
r3210 | max_width = Int(79, config=True) | ||
Robert Kern
|
r3209 | |||
# The newline character. | ||||
Robert Kern
|
r3210 | newline = Str('\n', config=True) | ||
Robert Kern
|
r3209 | |||
# The singleton prettyprinters. | ||||
# Maps the IDs of the builtin singleton objects to the format functions. | ||||
Robert Kern
|
r3210 | singleton_pprinters = Dict(config=True) | ||
Robert Kern
|
r3209 | def _singleton_pprinters_default(self): | ||
return pretty._singleton_pprinters.copy() | ||||
# The type-specific prettyprinters. | ||||
# Map type objects to the format functions. | ||||
Robert Kern
|
r3210 | type_pprinters = Dict(config=True) | ||
Robert Kern
|
r3209 | def _type_pprinters_default(self): | ||
return pretty._type_pprinters.copy() | ||||
# The deferred-import type-specific prettyprinters. | ||||
# Map (modulename, classname) pairs to the format functions. | ||||
Robert Kern
|
r3210 | deferred_pprinters = Dict(config=True) | ||
Robert Kern
|
r3209 | def _deferred_pprinters_default(self): | ||
return pretty._deferred_type_pprinters.copy() | ||||
#### FormatterABC interface #### | ||||
def __call__(self, obj): | ||||
""" Format the object. | ||||
""" | ||||
if not self.pprint: | ||||
Robert Kern
|
r3210 | try: | ||
return repr(obj) | ||||
except TypeError: | ||||
return '' | ||||
Robert Kern
|
r3209 | else: | ||
stream = StringIO() | ||||
printer = pretty.RepresentationPrinter(stream, self.verbose, | ||||
self.max_width, self.newline, | ||||
singleton_pprinters=self.singleton_pprinters, | ||||
type_pprinters=self.type_pprinters, | ||||
deferred_pprinters=self.deferred_pprinters) | ||||
printer.pretty(obj) | ||||
printer.flush() | ||||
return stream.getvalue() | ||||
#### DefaultFormatter interface #### | ||||
def for_type(self, typ, func): | ||||
""" | ||||
Add a pretty printer for a given type. | ||||
""" | ||||
oldfunc = self.type_pprinters.get(typ, None) | ||||
if func is not None: | ||||
# To support easy restoration of old pprinters, we need to ignore | ||||
# Nones. | ||||
self.type_pprinters[typ] = func | ||||
return oldfunc | ||||
def for_type_by_name(self, type_module, type_name, func): | ||||
""" | ||||
Add a pretty printer for a type specified by the module and name of | ||||
a type rather than the type object itself. | ||||
""" | ||||
key = (type_module, type_name) | ||||
oldfunc = self.deferred_pprinters.get(key, None) | ||||
if func is not None: | ||||
# To support easy restoration of old pprinters, we need to ignore | ||||
# Nones. | ||||
self.deferred_pprinters[key] = func | ||||
return oldfunc | ||||
class FormatterABC(object): | ||||
""" Abstract base class for Formatters. | ||||
""" | ||||
__metaclass__ = abc.ABCMeta | ||||
# The ID of the formatter. | ||||
id = 'abstract' | ||||
# The kind of data returned. | ||||
format = 'text' | ||||
@abc.abstractmethod | ||||
def __call__(self, obj): | ||||
""" Return a JSONable representation of the object. | ||||
""" | ||||
return repr(obj) | ||||
FormatterABC.register(DefaultFormatter) | ||||