reprlib.py 3.99 KB
Newer Older
1
"""Redo the builtin repr() (representation) but with limits on most sizes."""
Guido van Rossum's avatar
Guido van Rossum committed
2

3 4
__all__ = ["Repr","repr"]

5
import builtins
6
from itertools import islice
7

Guido van Rossum's avatar
Guido van Rossum committed
8
class Repr:
9

Tim Peters's avatar
Tim Peters committed
10 11 12 13
    def __init__(self):
        self.maxlevel = 6
        self.maxtuple = 6
        self.maxlist = 6
14
        self.maxarray = 5
Tim Peters's avatar
Tim Peters committed
15
        self.maxdict = 4
16 17
        self.maxset = 6
        self.maxfrozenset = 6
18
        self.maxdeque = 6
Tim Peters's avatar
Tim Peters committed
19 20
        self.maxstring = 30
        self.maxlong = 40
21
        self.maxother = 30
22

Tim Peters's avatar
Tim Peters committed
23 24
    def repr(self, x):
        return self.repr1(x, self.maxlevel)
25

Tim Peters's avatar
Tim Peters committed
26
    def repr1(self, x, level):
27
        typename = type(x).__name__
Tim Peters's avatar
Tim Peters committed
28
        if ' ' in typename:
29 30
            parts = typename.split()
            typename = '_'.join(parts)
Tim Peters's avatar
Tim Peters committed
31 32 33
        if hasattr(self, 'repr_' + typename):
            return getattr(self, 'repr_' + typename)(x, level)
        else:
34
            return self.repr_instance(x, level)
35

36
    def _repr_iterable(self, x, level, left, right, maxiter, trail=''):
Tim Peters's avatar
Tim Peters committed
37
        n = len(x)
38 39 40 41 42 43 44 45
        if level <= 0 and n:
            s = '...'
        else:
            newlevel = level - 1
            repr1 = self.repr1
            pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)]
            if n > maxiter:  pieces.append('...')
            s = ', '.join(pieces)
46
            if n == 1 and trail:  right = trail + right
47 48 49
        return '%s%s%s' % (left, s, right)

    def repr_tuple(self, x, level):
50
        return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',')
51

Tim Peters's avatar
Tim Peters committed
52
    def repr_list(self, x, level):
53
        return self._repr_iterable(x, level, '[', ']', self.maxlist)
54 55 56

    def repr_array(self, x, level):
        header = "array('%s', [" % x.typecode
57 58 59
        return self._repr_iterable(x, level, header, '])', self.maxarray)

    def repr_set(self, x, level):
60
        x = _possibly_sorted(x)
61 62 63
        return self._repr_iterable(x, level, 'set([', '])', self.maxset)

    def repr_frozenset(self, x, level):
64
        x = _possibly_sorted(x)
65 66
        return self._repr_iterable(x, level, 'frozenset([', '])',
                                   self.maxfrozenset)
67

68 69 70
    def repr_deque(self, x, level):
        return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque)

71
    def repr_dict(self, x, level):
Tim Peters's avatar
Tim Peters committed
72 73 74
        n = len(x)
        if n == 0: return '{}'
        if level <= 0: return '{...}'
75 76 77
        newlevel = level - 1
        repr1 = self.repr1
        pieces = []
78
        for key in islice(_possibly_sorted(x), self.maxdict):
79 80 81 82 83 84 85
            keyrepr = repr1(key, newlevel)
            valrepr = repr1(x[key], newlevel)
            pieces.append('%s: %s' % (keyrepr, valrepr))
        if n > self.maxdict: pieces.append('...')
        s = ', '.join(pieces)
        return '{%s}' % (s,)

86
    def repr_str(self, x, level):
87
        s = builtins.repr(x[:self.maxstring])
Tim Peters's avatar
Tim Peters committed
88
        if len(s) > self.maxstring:
89
            i = max(0, (self.maxstring-3)//2)
Tim Peters's avatar
Tim Peters committed
90
            j = max(0, self.maxstring-3-i)
91
            s = builtins.repr(x[:i] + x[len(x)-j:])
Tim Peters's avatar
Tim Peters committed
92 93
            s = s[:i] + '...' + s[len(s)-j:]
        return s
94

95
    def repr_int(self, x, level):
96
        s = builtins.repr(x) # XXX Hope this isn't too slow...
Tim Peters's avatar
Tim Peters committed
97
        if len(s) > self.maxlong:
98
            i = max(0, (self.maxlong-3)//2)
Tim Peters's avatar
Tim Peters committed
99 100 101
            j = max(0, self.maxlong-3-i)
            s = s[:i] + '...' + s[len(s)-j:]
        return s
102

Tim Peters's avatar
Tim Peters committed
103 104
    def repr_instance(self, x, level):
        try:
105
            s = builtins.repr(x)
Tim Peters's avatar
Tim Peters committed
106 107
            # Bugs in x.__repr__() can cause arbitrary
            # exceptions -- then make up something
108
        except Exception:
109
            return '<%s instance at %x>' % (x.__class__.__name__, id(x))
110 111 112
        if len(s) > self.maxother:
            i = max(0, (self.maxother-3)//2)
            j = max(0, self.maxother-3-i)
Tim Peters's avatar
Tim Peters committed
113 114
            s = s[:i] + '...' + s[len(s)-j:]
        return s
Guido van Rossum's avatar
Guido van Rossum committed
115

116 117 118 119 120 121 122 123 124 125

def _possibly_sorted(x):
    # Since not all sequences of items can be sorted and comparison
    # functions may raise arbitrary exceptions, return an unsorted
    # sequence in that case.
    try:
        return sorted(x)
    except Exception:
        return list(x)

126
aRepr = Repr()
Guido van Rossum's avatar
Guido van Rossum committed
127
repr = aRepr.repr