summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Böhn <fish2000@users.noreply.github.com>2021-09-22 20:45:58 (GMT)
committerGitHub <noreply@github.com>2021-09-22 20:45:58 (GMT)
commit8c21941ddafdf4925170f9cea22e2382dd3b0184 (patch)
treede17f630fb0338032c63086f6bead3ca00830d14
parent36122e18148c5b6c78ebce1d36d514fd7cf250f5 (diff)
downloadcpython-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.rst8
-rw-r--r--Lib/reprlib.py24
-rw-r--r--Lib/test/test_reprlib.py7
-rw-r--r--Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst4
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.