Skip to content

Commit a2a9675

Browse files
committed
Import reprlib from 3.2
1 parent aae0668 commit a2a9675

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed

reprlib32.py

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
"""Redo the builtin repr() (representation) but with limits on most sizes."""
2+
3+
__all__ = ["Repr", "repr", "recursive_repr"]
4+
5+
import builtins
6+
from itertools import islice
7+
try:
8+
from _thread import get_ident
9+
except ImportError:
10+
from _dummy_thread import get_ident
11+
12+
def recursive_repr(fillvalue='...'):
13+
'Decorator to make a repr function return fillvalue for a recursive call'
14+
15+
def decorating_function(user_function):
16+
repr_running = set()
17+
18+
def wrapper(self):
19+
key = id(self), get_ident()
20+
if key in repr_running:
21+
return fillvalue
22+
repr_running.add(key)
23+
try:
24+
result = user_function(self)
25+
finally:
26+
repr_running.discard(key)
27+
return result
28+
29+
# Can't use functools.wraps() here because of bootstrap issues
30+
wrapper.__module__ = getattr(user_function, '__module__')
31+
wrapper.__doc__ = getattr(user_function, '__doc__')
32+
wrapper.__name__ = getattr(user_function, '__name__')
33+
wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
34+
return wrapper
35+
36+
return decorating_function
37+
38+
class Repr:
39+
40+
def __init__(self):
41+
self.maxlevel = 6
42+
self.maxtuple = 6
43+
self.maxlist = 6
44+
self.maxarray = 5
45+
self.maxdict = 4
46+
self.maxset = 6
47+
self.maxfrozenset = 6
48+
self.maxdeque = 6
49+
self.maxstring = 30
50+
self.maxlong = 40
51+
self.maxother = 30
52+
53+
def repr(self, x):
54+
return self.repr1(x, self.maxlevel)
55+
56+
def repr1(self, x, level):
57+
typename = type(x).__name__
58+
if ' ' in typename:
59+
parts = typename.split()
60+
typename = '_'.join(parts)
61+
if hasattr(self, 'repr_' + typename):
62+
return getattr(self, 'repr_' + typename)(x, level)
63+
else:
64+
return self.repr_instance(x, level)
65+
66+
def _repr_iterable(self, x, level, left, right, maxiter, trail=''):
67+
n = len(x)
68+
if level <= 0 and n:
69+
s = '...'
70+
else:
71+
newlevel = level - 1
72+
repr1 = self.repr1
73+
pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)]
74+
if n > maxiter: pieces.append('...')
75+
s = ', '.join(pieces)
76+
if n == 1 and trail: right = trail + right
77+
return '%s%s%s' % (left, s, right)
78+
79+
def repr_tuple(self, x, level):
80+
return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',')
81+
82+
def repr_list(self, x, level):
83+
return self._repr_iterable(x, level, '[', ']', self.maxlist)
84+
85+
def repr_array(self, x, level):
86+
header = "array('%s', [" % x.typecode
87+
return self._repr_iterable(x, level, header, '])', self.maxarray)
88+
89+
def repr_set(self, x, level):
90+
x = _possibly_sorted(x)
91+
return self._repr_iterable(x, level, 'set([', '])', self.maxset)
92+
93+
def repr_frozenset(self, x, level):
94+
x = _possibly_sorted(x)
95+
return self._repr_iterable(x, level, 'frozenset([', '])',
96+
self.maxfrozenset)
97+
98+
def repr_deque(self, x, level):
99+
return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque)
100+
101+
def repr_dict(self, x, level):
102+
n = len(x)
103+
if n == 0: return '{}'
104+
if level <= 0: return '{...}'
105+
newlevel = level - 1
106+
repr1 = self.repr1
107+
pieces = []
108+
for key in islice(_possibly_sorted(x), self.maxdict):
109+
keyrepr = repr1(key, newlevel)
110+
valrepr = repr1(x[key], newlevel)
111+
pieces.append('%s: %s' % (keyrepr, valrepr))
112+
if n > self.maxdict: pieces.append('...')
113+
s = ', '.join(pieces)
114+
return '{%s}' % (s,)
115+
116+
def repr_str(self, x, level):
117+
s = builtins.repr(x[:self.maxstring])
118+
if len(s) > self.maxstring:
119+
i = max(0, (self.maxstring-3)//2)
120+
j = max(0, self.maxstring-3-i)
121+
s = builtins.repr(x[:i] + x[len(x)-j:])
122+
s = s[:i] + '...' + s[len(s)-j:]
123+
return s
124+
125+
def repr_int(self, x, level):
126+
s = builtins.repr(x) # XXX Hope this isn't too slow...
127+
if len(s) > self.maxlong:
128+
i = max(0, (self.maxlong-3)//2)
129+
j = max(0, self.maxlong-3-i)
130+
s = s[:i] + '...' + s[len(s)-j:]
131+
return s
132+
133+
def repr_instance(self, x, level):
134+
try:
135+
s = builtins.repr(x)
136+
# Bugs in x.__repr__() can cause arbitrary
137+
# exceptions -- then make up something
138+
except Exception:
139+
return '<%s instance at %x>' % (x.__class__.__name__, id(x))
140+
if len(s) > self.maxother:
141+
i = max(0, (self.maxother-3)//2)
142+
j = max(0, self.maxother-3-i)
143+
s = s[:i] + '...' + s[len(s)-j:]
144+
return s
145+
146+
147+
def _possibly_sorted(x):
148+
# Since not all sequences of items can be sorted and comparison
149+
# functions may raise arbitrary exceptions, return an unsorted
150+
# sequence in that case.
151+
try:
152+
return sorted(x)
153+
except Exception:
154+
return list(x)
155+
156+
aRepr = Repr()
157+
repr = aRepr.repr

0 commit comments

Comments
 (0)