|
|
# -*- coding: utf-8 -*-
|
|
|
"""Displayhook formatters.
|
|
|
|
|
|
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::
|
|
|
|
|
|
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.
|
|
|
|
|
|
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.
|
|
|
# This is often, but not always a MIME type.
|
|
|
format = Str('text/plain')
|
|
|
|
|
|
# Whether to pretty-print or not.
|
|
|
pprint = Bool(True, config=True)
|
|
|
|
|
|
# Whether to be verbose or not.
|
|
|
verbose = Bool(False, config=True)
|
|
|
|
|
|
# The maximum width.
|
|
|
max_width = Int(79, config=True)
|
|
|
|
|
|
# The newline character.
|
|
|
newline = Str('\n', config=True)
|
|
|
|
|
|
# The singleton prettyprinters.
|
|
|
# Maps the IDs of the builtin singleton objects to the format functions.
|
|
|
singleton_pprinters = Dict(config=True)
|
|
|
def _singleton_pprinters_default(self):
|
|
|
return pretty._singleton_pprinters.copy()
|
|
|
|
|
|
# The type-specific prettyprinters.
|
|
|
# Map type objects to the format functions.
|
|
|
type_pprinters = Dict(config=True)
|
|
|
def _type_pprinters_default(self):
|
|
|
return pretty._type_pprinters.copy()
|
|
|
|
|
|
# The deferred-import type-specific prettyprinters.
|
|
|
# Map (modulename, classname) pairs to the format functions.
|
|
|
deferred_pprinters = Dict(config=True)
|
|
|
def _deferred_pprinters_default(self):
|
|
|
return pretty._deferred_type_pprinters.copy()
|
|
|
|
|
|
#### FormatterABC interface ####
|
|
|
|
|
|
def __call__(self, obj):
|
|
|
""" Format the object.
|
|
|
"""
|
|
|
if not self.pprint:
|
|
|
try:
|
|
|
return repr(obj)
|
|
|
except TypeError:
|
|
|
return ''
|
|
|
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/plain'
|
|
|
|
|
|
@abc.abstractmethod
|
|
|
def __call__(self, obj):
|
|
|
""" Return a JSONable representation of the object.
|
|
|
|
|
|
If the object cannot be formatted by this formatter, then return None
|
|
|
"""
|
|
|
try:
|
|
|
return repr(obj)
|
|
|
except TypeError:
|
|
|
return None
|
|
|
|
|
|
FormatterABC.register(DefaultFormatter)
|
|
|
|