gh-92734: Add indentation feature to reprlib.Repr (GH-92735)

This commit is contained in:
finefoot 2022-09-08 20:51:44 +02:00 committed by GitHub
parent aa3b4cf779
commit c06c001b30
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 421 additions and 5 deletions

View file

@ -38,7 +38,7 @@ class Repr:
def __init__(
self, *, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4,
maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40,
maxother=30, fillvalue='...',
maxother=30, fillvalue='...', indent=None,
):
self.maxlevel = maxlevel
self.maxtuple = maxtuple
@ -52,6 +52,7 @@ class Repr:
self.maxlong = maxlong
self.maxother = maxother
self.fillvalue = fillvalue
self.indent = indent
def repr(self, x):
return self.repr1(x, self.maxlevel)
@ -66,6 +67,26 @@ class Repr:
else:
return self.repr_instance(x, level)
def _join(self, pieces, level):
if self.indent is None:
return ', '.join(pieces)
if not pieces:
return ''
indent = self.indent
if isinstance(indent, int):
if indent < 0:
raise ValueError(
f'Repr.indent cannot be negative int (was {indent!r})'
)
indent *= ' '
try:
sep = ',\n' + (self.maxlevel - level + 1) * indent
except TypeError as error:
raise TypeError(
f'Repr.indent must be a str, int or None, not {type(indent)}'
) from error
return sep.join(('', *pieces, ''))[1:-len(indent) or None]
def _repr_iterable(self, x, level, left, right, maxiter, trail=''):
n = len(x)
if level <= 0 and n:
@ -76,8 +97,8 @@ class Repr:
pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)]
if n > maxiter:
pieces.append(self.fillvalue)
s = ', '.join(pieces)
if n == 1 and trail:
s = self._join(pieces, level)
if n == 1 and trail and self.indent is None:
right = trail + right
return '%s%s%s' % (left, s, right)
@ -124,7 +145,7 @@ class Repr:
pieces.append('%s: %s' % (keyrepr, valrepr))
if n > self.maxdict:
pieces.append(self.fillvalue)
s = ', '.join(pieces)
s = self._join(pieces, level)
return '{%s}' % (s,)
def repr_str(self, x, level):