@@ -29,49 +29,100 @@ def wrapper(self):
29
29
wrapper .__name__ = getattr (user_function , '__name__' )
30
30
wrapper .__qualname__ = getattr (user_function , '__qualname__' )
31
31
wrapper .__annotations__ = getattr (user_function , '__annotations__' , {})
32
+ wrapper .__type_params__ = getattr (user_function , '__type_params__' , ())
33
+ wrapper .__wrapped__ = user_function
32
34
return wrapper
33
35
34
36
return decorating_function
35
37
36
38
class Repr :
37
-
38
- def __init__ (self ):
39
- self .maxlevel = 6
40
- self .maxtuple = 6
41
- self .maxlist = 6
42
- self .maxarray = 5
43
- self .maxdict = 4
44
- self .maxset = 6
45
- self .maxfrozenset = 6
46
- self .maxdeque = 6
47
- self .maxstring = 30
48
- self .maxlong = 40
49
- self .maxother = 30
39
+ _lookup = {
40
+ 'tuple' : 'builtins' ,
41
+ 'list' : 'builtins' ,
42
+ 'array' : 'array' ,
43
+ 'set' : 'builtins' ,
44
+ 'frozenset' : 'builtins' ,
45
+ 'deque' : 'collections' ,
46
+ 'dict' : 'builtins' ,
47
+ 'str' : 'builtins' ,
48
+ 'int' : 'builtins'
49
+ }
50
+
51
+ def __init__ (
52
+ self , * , maxlevel = 6 , maxtuple = 6 , maxlist = 6 , maxarray = 5 , maxdict = 4 ,
53
+ maxset = 6 , maxfrozenset = 6 , maxdeque = 6 , maxstring = 30 , maxlong = 40 ,
54
+ maxother = 30 , fillvalue = '...' , indent = None ,
55
+ ):
56
+ self .maxlevel = maxlevel
57
+ self .maxtuple = maxtuple
58
+ self .maxlist = maxlist
59
+ self .maxarray = maxarray
60
+ self .maxdict = maxdict
61
+ self .maxset = maxset
62
+ self .maxfrozenset = maxfrozenset
63
+ self .maxdeque = maxdeque
64
+ self .maxstring = maxstring
65
+ self .maxlong = maxlong
66
+ self .maxother = maxother
67
+ self .fillvalue = fillvalue
68
+ self .indent = indent
50
69
51
70
def repr (self , x ):
52
71
return self .repr1 (x , self .maxlevel )
53
72
54
73
def repr1 (self , x , level ):
55
- typename = type (x ).__name__
74
+ cls = type (x )
75
+ typename = cls .__name__
76
+
56
77
if ' ' in typename :
57
78
parts = typename .split ()
58
79
typename = '_' .join (parts )
59
- if hasattr (self , 'repr_' + typename ):
60
- return getattr (self , 'repr_' + typename )(x , level )
61
- else :
62
- return self .repr_instance (x , level )
80
+
81
+ method = getattr (self , 'repr_' + typename , None )
82
+ if method :
83
+ # not defined in this class
84
+ if typename not in self ._lookup :
85
+ return method (x , level )
86
+ module = getattr (cls , '__module__' , None )
87
+ # defined in this class and is the module intended
88
+ if module == self ._lookup [typename ]:
89
+ return method (x , level )
90
+
91
+ return self .repr_instance (x , level )
92
+
93
+ def _join (self , pieces , level ):
94
+ if self .indent is None :
95
+ return ', ' .join (pieces )
96
+ if not pieces :
97
+ return ''
98
+ indent = self .indent
99
+ if isinstance (indent , int ):
100
+ if indent < 0 :
101
+ raise ValueError (
102
+ f'Repr.indent cannot be negative int (was { indent !r} )'
103
+ )
104
+ indent *= ' '
105
+ try :
106
+ sep = ',\n ' + (self .maxlevel - level + 1 ) * indent
107
+ except TypeError as error :
108
+ raise TypeError (
109
+ f'Repr.indent must be a str, int or None, not { type (indent )} '
110
+ ) from error
111
+ return sep .join (('' , * pieces , '' ))[1 :- len (indent ) or None ]
63
112
64
113
def _repr_iterable (self , x , level , left , right , maxiter , trail = '' ):
65
114
n = len (x )
66
115
if level <= 0 and n :
67
- s = '...'
116
+ s = self . fillvalue
68
117
else :
69
118
newlevel = level - 1
70
119
repr1 = self .repr1
71
120
pieces = [repr1 (elem , newlevel ) for elem in islice (x , maxiter )]
72
- if n > maxiter : pieces .append ('...' )
73
- s = ', ' .join (pieces )
74
- if n == 1 and trail : right = trail + right
121
+ if n > maxiter :
122
+ pieces .append (self .fillvalue )
123
+ s = self ._join (pieces , level )
124
+ if n == 1 and trail and self .indent is None :
125
+ right = trail + right
75
126
return '%s%s%s' % (left , s , right )
76
127
77
128
def repr_tuple (self , x , level ):
@@ -104,17 +155,20 @@ def repr_deque(self, x, level):
104
155
105
156
def repr_dict (self , x , level ):
106
157
n = len (x )
107
- if n == 0 : return '{}'
108
- if level <= 0 : return '{...}'
158
+ if n == 0 :
159
+ return '{}'
160
+ if level <= 0 :
161
+ return '{' + self .fillvalue + '}'
109
162
newlevel = level - 1
110
163
repr1 = self .repr1
111
164
pieces = []
112
165
for key in islice (_possibly_sorted (x ), self .maxdict ):
113
166
keyrepr = repr1 (key , newlevel )
114
167
valrepr = repr1 (x [key ], newlevel )
115
168
pieces .append ('%s: %s' % (keyrepr , valrepr ))
116
- if n > self .maxdict : pieces .append ('...' )
117
- s = ', ' .join (pieces )
169
+ if n > self .maxdict :
170
+ pieces .append (self .fillvalue )
171
+ s = self ._join (pieces , level )
118
172
return '{%s}' % (s ,)
119
173
120
174
def repr_str (self , x , level ):
@@ -123,15 +177,15 @@ def repr_str(self, x, level):
123
177
i = max (0 , (self .maxstring - 3 )// 2 )
124
178
j = max (0 , self .maxstring - 3 - i )
125
179
s = builtins .repr (x [:i ] + x [len (x )- j :])
126
- s = s [:i ] + '...' + s [len (s )- j :]
180
+ s = s [:i ] + self . fillvalue + s [len (s )- j :]
127
181
return s
128
182
129
183
def repr_int (self , x , level ):
130
184
s = builtins .repr (x ) # XXX Hope this isn't too slow...
131
185
if len (s ) > self .maxlong :
132
186
i = max (0 , (self .maxlong - 3 )// 2 )
133
187
j = max (0 , self .maxlong - 3 - i )
134
- s = s [:i ] + '...' + s [len (s )- j :]
188
+ s = s [:i ] + self . fillvalue + s [len (s )- j :]
135
189
return s
136
190
137
191
def repr_instance (self , x , level ):
@@ -144,7 +198,7 @@ def repr_instance(self, x, level):
144
198
if len (s ) > self .maxother :
145
199
i = max (0 , (self .maxother - 3 )// 2 )
146
200
j = max (0 , self .maxother - 3 - i )
147
- s = s [:i ] + '...' + s [len (s )- j :]
201
+ s = s [:i ] + self . fillvalue + s [len (s )- j :]
148
202
return s
149
203
150
204
0 commit comments