]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39549: reprlib.Repr uses a “fillvalue” attribute (GH-18343)
authorAlexander Böhn <fish2000@users.noreply.github.com>
Wed, 22 Sep 2021 20:45:58 +0000 (16:45 -0400)
committerGitHub <noreply@github.com>
Wed, 22 Sep 2021 20:45:58 +0000 (15:45 -0500)
Doc/library/reprlib.rst
Lib/reprlib.py
Lib/test/test_reprlib.py
Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst [new file with mode: 0644]

index 1a0c1b0dcd1aa9c04760250f4fa60f15be39b33f..4b37c5ba60f4e62c8af00fc9b309d5e86868b0f2 100644 (file)
@@ -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``.
index 616b3439b5de30a9a8cef6b1beb100625e825ee4..f3518df105e418a995502b39c669c03b3d013ca7 100644 (file)
@@ -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
 
 
index 0555b71bbf21af36865bcd1ef3d93e5e59d83447..aa326399ab22471fe343208d41c674bd687714de 100644 (file)
@@ -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 (file)
index 0000000..91d63a9
--- /dev/null
@@ -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.