mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
#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:
parent
da407232e0
commit
dcd6b52206
1 changed files with 59 additions and 54 deletions
113
Lib/pprint.py
113
Lib/pprint.py
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue