#1351692: in pprint, always call format() for dict and list items to enable

custom formatting of contents via subclassing PrettyPrinter.
This commit is contained in:
Georg Brandl 2008-01-20 11:13:29 +00:00
parent da407232e0
commit dcd6b52206

View file

@ -131,65 +131,70 @@ class PrettyPrinter:
sepLines = _len(rep) > (self._width - 1 - indent - allowance) sepLines = _len(rep) > (self._width - 1 - indent - allowance)
write = stream.write write = stream.write
if sepLines: r = getattr(typ, "__repr__", None)
r = getattr(typ, "__repr__", None) if issubclass(typ, dict) and r is dict.__repr__:
if issubclass(typ, dict) and r is dict.__repr__: write('{')
write('{') if self._indent_per_level > 1:
if self._indent_per_level > 1: write((self._indent_per_level - 1) * ' ')
write((self._indent_per_level - 1) * ' ') length = _len(object)
length = _len(object) if length:
if length: context[objid] = 1
context[objid] = 1 indent = indent + self._indent_per_level
indent = indent + self._indent_per_level items = object.items()
items = object.items() items.sort()
items.sort() key, ent = items[0]
key, ent = items[0] rep = self._repr(key, context, level)
rep = self._repr(key, context, level) write(rep)
write(rep) write(': ')
write(': ') self._format(ent, stream, indent + _len(rep) + 2,
self._format(ent, stream, indent + _len(rep) + 2, allowance + 1, context, level)
allowance + 1, context, level) if length > 1:
if length > 1: for key, ent in items[1:]:
for key, ent in items[1:]: rep = self._repr(key, context, level)
rep = self._repr(key, context, level) if sepLines:
write(',\n%s%s: ' % (' '*indent, rep)) write(',\n%s%s: ' % (' '*indent, rep))
self._format(ent, stream, indent + _len(rep) + 2, else:
allowance + 1, context, level) write(', %s: ' % rep)
indent = indent - self._indent_per_level self._format(ent, stream, indent + _len(rep) + 2,
del context[objid] allowance + 1, context, level)
write('}') indent = indent - self._indent_per_level
return del context[objid]
write('}')
return
if (issubclass(typ, list) and r is list.__repr__) or \ if (issubclass(typ, list) and r is list.__repr__) or \
(issubclass(typ, tuple) and r is tuple.__repr__): (issubclass(typ, tuple) and r is tuple.__repr__):
if issubclass(typ, list): if issubclass(typ, list):
write('[') write('[')
endchar = ']' endchar = ']'
else: else:
write('(') write('(')
endchar = ')' endchar = ')'
if self._indent_per_level > 1: if self._indent_per_level > 1:
write((self._indent_per_level - 1) * ' ') write((self._indent_per_level - 1) * ' ')
length = _len(object) length = _len(object)
if length: if length:
context[objid] = 1 context[objid] = 1
indent = indent + self._indent_per_level indent = indent + self._indent_per_level
self._format(object[0], stream, indent, allowance + 1, self._format(object[0], stream, indent, allowance + 1,
context, level) context, level)
if length > 1: if length > 1:
for ent in object[1:]: for ent in object[1:]:
if sepLines:
write(',\n' + ' '*indent) write(',\n' + ' '*indent)
self._format(ent, stream, indent, else:
allowance + 1, context, level) write(', ')
indent = indent - self._indent_per_level self._format(ent, stream, indent,
del context[objid] allowance + 1, context, level)
if issubclass(typ, tuple) and length == 1: indent = indent - self._indent_per_level
write(',') del context[objid]
write(endchar) if issubclass(typ, tuple) and length == 1:
return write(',')
write(endchar)
return
write(rep) write(rep)
def _repr(self, object, context, level): def _repr(self, object, context, level):
repr, readable, recursive = self.format(object, context.copy(), repr, readable, recursive = self.format(object, context.copy(),
self._depth, level) self._depth, level)