diff options
author | Alexander Böhn <fish2000@users.noreply.github.com> | 2021-09-22 20:45:58 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-22 20:45:58 (GMT) |
commit | 8c21941ddafdf4925170f9cea22e2382dd3b0184 (patch) | |
tree | de17f630fb0338032c63086f6bead3ca00830d14 | |
parent | 36122e18148c5b6c78ebce1d36d514fd7cf250f5 (diff) | |
download | cpython-8c21941ddafdf4925170f9cea22e2382dd3b0184.zip cpython-8c21941ddafdf4925170f9cea22e2382dd3b0184.tar.gz cpython-8c21941ddafdf4925170f9cea22e2382dd3b0184.tar.bz2 |
bpo-39549: reprlib.Repr uses a “fillvalue” attribute (GH-18343)
-rw-r--r-- | Doc/library/reprlib.rst | 8 | ||||
-rw-r--r-- | Lib/reprlib.py | 24 | ||||
-rw-r--r-- | Lib/test/test_reprlib.py | 7 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst | 4 |
4 files changed, 34 insertions, 9 deletions
diff --git a/Doc/library/reprlib.rst b/Doc/library/reprlib.rst index 1a0c1b0..4b37c5b 100644 --- a/Doc/library/reprlib.rst +++ b/Doc/library/reprlib.rst @@ -76,6 +76,14 @@ size limits for the representations of different object types, and methods which format specific object types. +.. attribute:: Repr.fillvalue + + This string is displayed for recursive references. It defaults to + ``...``. + + .. versionadded:: 3.11 + + .. attribute:: Repr.maxlevel Depth limit on the creation of recursive representations. The default is ``6``. diff --git a/Lib/reprlib.py b/Lib/reprlib.py index 616b343..f3518df 100644 --- a/Lib/reprlib.py +++ b/Lib/reprlib.py @@ -36,6 +36,7 @@ def recursive_repr(fillvalue='...'): class Repr: def __init__(self): + self.fillvalue = '...' self.maxlevel = 6 self.maxtuple = 6 self.maxlist = 6 @@ -64,14 +65,16 @@ class Repr: def _repr_iterable(self, x, level, left, right, maxiter, trail=''): n = len(x) if level <= 0 and n: - s = '...' + s = self.fillvalue else: newlevel = level - 1 repr1 = self.repr1 pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)] - if n > maxiter: pieces.append('...') + if n > maxiter: + pieces.append(self.fillvalue) s = ', '.join(pieces) - if n == 1 and trail: right = trail + right + if n == 1 and trail: + right = trail + right return '%s%s%s' % (left, s, right) def repr_tuple(self, x, level): @@ -104,8 +107,10 @@ class Repr: def repr_dict(self, x, level): n = len(x) - if n == 0: return '{}' - if level <= 0: return '{...}' + if n == 0: + return '{}' + if level <= 0: + return '{' + self.fillvalue + '}' newlevel = level - 1 repr1 = self.repr1 pieces = [] @@ -113,7 +118,8 @@ class Repr: keyrepr = repr1(key, newlevel) valrepr = repr1(x[key], newlevel) pieces.append('%s: %s' % (keyrepr, valrepr)) - if n > self.maxdict: pieces.append('...') + if n > self.maxdict: + pieces.append(self.fillvalue) s = ', '.join(pieces) return '{%s}' % (s,) @@ -123,7 +129,7 @@ class Repr: i = max(0, (self.maxstring-3)//2) j = max(0, self.maxstring-3-i) s = builtins.repr(x[:i] + x[len(x)-j:]) - s = s[:i] + '...' + s[len(s)-j:] + s = s[:i] + self.fillvalue + s[len(s)-j:] return s def repr_int(self, x, level): @@ -131,7 +137,7 @@ class Repr: if len(s) > self.maxlong: i = max(0, (self.maxlong-3)//2) j = max(0, self.maxlong-3-i) - s = s[:i] + '...' + s[len(s)-j:] + s = s[:i] + self.fillvalue + s[len(s)-j:] return s def repr_instance(self, x, level): @@ -144,7 +150,7 @@ class Repr: if len(s) > self.maxother: i = max(0, (self.maxother-3)//2) j = max(0, self.maxother-3-i) - s = s[:i] + '...' + s[len(s)-j:] + s = s[:i] + self.fillvalue + s[len(s)-j:] return s diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py index 0555b71..aa32639 100644 --- a/Lib/test/test_reprlib.py +++ b/Lib/test/test_reprlib.py @@ -51,6 +51,13 @@ class ReprTests(unittest.TestCase): expected = repr(t3)[:-2] + "...)" eq(r2.repr(t3), expected) + # modified fillvalue: + r3 = Repr() + r3.fillvalue = '+++' + r3.maxtuple = 2 + expected = repr(t3)[:-2] + "+++)" + eq(r3.repr(t3), expected) + def test_container(self): from array import array from collections import deque diff --git a/Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst b/Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst new file mode 100644 index 0000000..91d63a9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst @@ -0,0 +1,4 @@ +Whereas the code for reprlib.Repr had previously used a hardcoded string +value of '...', this PR updates it to use of a “fillvalue” attribute, whose +value defaults to '...' and can be reset in either individual reprlib.Repr +instances or in subclasses thereof. |