##// END OF EJS Templates
Remove refs to Python 2.4, use group context manager
Frazer McLean -
Show More
@@ -1,877 +1,847 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 Python advanced pretty printer. This pretty printer is intended to
3 Python advanced pretty printer. This pretty printer is intended to
4 replace the old `pprint` python module which does not allow developers
4 replace the old `pprint` python module which does not allow developers
5 to provide their own pretty print callbacks.
5 to provide their own pretty print callbacks.
6
6
7 This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`.
7 This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`.
8
8
9
9
10 Example Usage
10 Example Usage
11 -------------
11 -------------
12
12
13 To directly print the representation of an object use `pprint`::
13 To directly print the representation of an object use `pprint`::
14
14
15 from pretty import pprint
15 from pretty import pprint
16 pprint(complex_object)
16 pprint(complex_object)
17
17
18 To get a string of the output use `pretty`::
18 To get a string of the output use `pretty`::
19
19
20 from pretty import pretty
20 from pretty import pretty
21 string = pretty(complex_object)
21 string = pretty(complex_object)
22
22
23
23
24 Extending
24 Extending
25 ---------
25 ---------
26
26
27 The pretty library allows developers to add pretty printing rules for their
27 The pretty library allows developers to add pretty printing rules for their
28 own objects. This process is straightforward. All you have to do is to
28 own objects. This process is straightforward. All you have to do is to
29 add a `_repr_pretty_` method to your object and call the methods on the
29 add a `_repr_pretty_` method to your object and call the methods on the
30 pretty printer passed::
30 pretty printer passed::
31
31
32 class MyObject(object):
32 class MyObject(object):
33
33
34 def _repr_pretty_(self, p, cycle):
34 def _repr_pretty_(self, p, cycle):
35 ...
35 ...
36
36
37 Depending on the python version you want to support you have two
37 Here is an example implementation of a `_repr_pretty_` method for a list
38 possibilities. The following list shows the python 2.5 version and the
38 subclass::
39 compatibility one.
40
41
42 Here the example implementation of a `_repr_pretty_` method for a list
43 subclass for python 2.5 and higher (python 2.5 requires the with statement
44 __future__ import)::
45
39
46 class MyList(list):
40 class MyList(list):
47
41
48 def _repr_pretty_(self, p, cycle):
42 def _repr_pretty_(self, p, cycle):
49 if cycle:
43 if cycle:
50 p.text('MyList(...)')
44 p.text('MyList(...)')
51 else:
45 else:
52 with p.group(8, 'MyList([', '])'):
46 with p.group(8, 'MyList([', '])'):
53 for idx, item in enumerate(self):
47 for idx, item in enumerate(self):
54 if idx:
48 if idx:
55 p.text(',')
49 p.text(',')
56 p.breakable()
50 p.breakable()
57 p.pretty(item)
51 p.pretty(item)
58
52
59 The `cycle` parameter is `True` if pretty detected a cycle. You *have* to
53 The `cycle` parameter is `True` if pretty detected a cycle. You *have* to
60 react to that or the result is an infinite loop. `p.text()` just adds
54 react to that or the result is an infinite loop. `p.text()` just adds
61 non breaking text to the output, `p.breakable()` either adds a whitespace
55 non breaking text to the output, `p.breakable()` either adds a whitespace
62 or breaks here. If you pass it an argument it's used instead of the
56 or breaks here. If you pass it an argument it's used instead of the
63 default space. `p.pretty` prettyprints another object using the pretty print
57 default space. `p.pretty` prettyprints another object using the pretty print
64 method.
58 method.
65
59
66 The first parameter to the `group` function specifies the extra indentation
60 The first parameter to the `group` function specifies the extra indentation
67 of the next line. In this example the next item will either be not
61 of the next line. In this example the next item will either be on the same
68 breaked (if the items are short enough) or aligned with the right edge of
62 line (if the items are short enough) or aligned with the right edge of the
69 the opening bracked of `MyList`.
63 opening bracket of `MyList`.
70
71 If you want to support python 2.4 and lower you can use this code::
72
73 class MyList(list):
74
75 def _repr_pretty_(self, p, cycle):
76 if cycle:
77 p.text('MyList(...)')
78 else:
79 p.begin_group(8, 'MyList([')
80 for idx, item in enumerate(self):
81 if idx:
82 p.text(',')
83 p.breakable()
84 p.pretty(item)
85 p.end_group(8, '])')
86
64
87 If you just want to indent something you can use the group function
65 If you just want to indent something you can use the group function
88 without open / close parameters. Under python 2.5 you can also use this
66 without open / close parameters. Yu can also use this code::
89 code::
90
67
91 with p.indent(2):
68 with p.indent(2):
92 ...
69 ...
93
70
94 Or under python2.4 you might want to modify ``p.indentation`` by hand but
95 this is rather ugly.
96
97 Inheritance diagram:
71 Inheritance diagram:
98
72
99 .. inheritance-diagram:: IPython.lib.pretty
73 .. inheritance-diagram:: IPython.lib.pretty
100 :parts: 3
74 :parts: 3
101
75
102 :copyright: 2007 by Armin Ronacher.
76 :copyright: 2007 by Armin Ronacher.
103 Portions (c) 2009 by Robert Kern.
77 Portions (c) 2009 by Robert Kern.
104 :license: BSD License.
78 :license: BSD License.
105 """
79 """
106 from __future__ import print_function
80 from __future__ import print_function
107 from contextlib import contextmanager
81 from contextlib import contextmanager
108 import sys
82 import sys
109 import types
83 import types
110 import re
84 import re
111 import datetime
85 import datetime
112 from collections import deque
86 from collections import deque
113
87
114 from IPython.utils.py3compat import PY3, cast_unicode
88 from IPython.utils.py3compat import PY3, cast_unicode
115 from IPython.utils.encoding import get_stream_enc
89 from IPython.utils.encoding import get_stream_enc
116
90
117 from io import StringIO
91 from io import StringIO
118
92
119
93
120 __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
94 __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
121 'for_type', 'for_type_by_name']
95 'for_type', 'for_type_by_name']
122
96
123
97
124 MAX_SEQ_LENGTH = 1000
98 MAX_SEQ_LENGTH = 1000
125 _re_pattern_type = type(re.compile(''))
99 _re_pattern_type = type(re.compile(''))
126
100
127 def _safe_getattr(obj, attr, default=None):
101 def _safe_getattr(obj, attr, default=None):
128 """Safe version of getattr.
102 """Safe version of getattr.
129
103
130 Same as getattr, but will return ``default`` on any Exception,
104 Same as getattr, but will return ``default`` on any Exception,
131 rather than raising.
105 rather than raising.
132 """
106 """
133 try:
107 try:
134 return getattr(obj, attr, default)
108 return getattr(obj, attr, default)
135 except Exception:
109 except Exception:
136 return default
110 return default
137
111
138 if PY3:
112 if PY3:
139 CUnicodeIO = StringIO
113 CUnicodeIO = StringIO
140 else:
114 else:
141 class CUnicodeIO(StringIO):
115 class CUnicodeIO(StringIO):
142 """StringIO that casts str to unicode on Python 2"""
116 """StringIO that casts str to unicode on Python 2"""
143 def write(self, text):
117 def write(self, text):
144 return super(CUnicodeIO, self).write(
118 return super(CUnicodeIO, self).write(
145 cast_unicode(text, encoding=get_stream_enc(sys.stdout)))
119 cast_unicode(text, encoding=get_stream_enc(sys.stdout)))
146
120
147
121
148 def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
122 def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
149 """
123 """
150 Pretty print the object's representation.
124 Pretty print the object's representation.
151 """
125 """
152 stream = CUnicodeIO()
126 stream = CUnicodeIO()
153 printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length)
127 printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length)
154 printer.pretty(obj)
128 printer.pretty(obj)
155 printer.flush()
129 printer.flush()
156 return stream.getvalue()
130 return stream.getvalue()
157
131
158
132
159 def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
133 def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
160 """
134 """
161 Like `pretty` but print to stdout.
135 Like `pretty` but print to stdout.
162 """
136 """
163 printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length)
137 printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length)
164 printer.pretty(obj)
138 printer.pretty(obj)
165 printer.flush()
139 printer.flush()
166 sys.stdout.write(newline)
140 sys.stdout.write(newline)
167 sys.stdout.flush()
141 sys.stdout.flush()
168
142
169 class _PrettyPrinterBase(object):
143 class _PrettyPrinterBase(object):
170
144
171 @contextmanager
145 @contextmanager
172 def indent(self, indent):
146 def indent(self, indent):
173 """with statement support for indenting/dedenting."""
147 """with statement support for indenting/dedenting."""
174 self.indentation += indent
148 self.indentation += indent
175 try:
149 try:
176 yield
150 yield
177 finally:
151 finally:
178 self.indentation -= indent
152 self.indentation -= indent
179
153
180 @contextmanager
154 @contextmanager
181 def group(self, indent=0, open='', close=''):
155 def group(self, indent=0, open='', close=''):
182 """like begin_group / end_group but for the with statement."""
156 """like begin_group / end_group but for the with statement."""
183 self.begin_group(indent, open)
157 self.begin_group(indent, open)
184 try:
158 try:
185 yield
159 yield
186 finally:
160 finally:
187 self.end_group(indent, close)
161 self.end_group(indent, close)
188
162
189 class PrettyPrinter(_PrettyPrinterBase):
163 class PrettyPrinter(_PrettyPrinterBase):
190 """
164 """
191 Baseclass for the `RepresentationPrinter` prettyprinter that is used to
165 Baseclass for the `RepresentationPrinter` prettyprinter that is used to
192 generate pretty reprs of objects. Contrary to the `RepresentationPrinter`
166 generate pretty reprs of objects. Contrary to the `RepresentationPrinter`
193 this printer knows nothing about the default pprinters or the `_repr_pretty_`
167 this printer knows nothing about the default pprinters or the `_repr_pretty_`
194 callback method.
168 callback method.
195 """
169 """
196
170
197 def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
171 def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
198 self.output = output
172 self.output = output
199 self.max_width = max_width
173 self.max_width = max_width
200 self.newline = newline
174 self.newline = newline
201 self.max_seq_length = max_seq_length
175 self.max_seq_length = max_seq_length
202 self.output_width = 0
176 self.output_width = 0
203 self.buffer_width = 0
177 self.buffer_width = 0
204 self.buffer = deque()
178 self.buffer = deque()
205
179
206 root_group = Group(0)
180 root_group = Group(0)
207 self.group_stack = [root_group]
181 self.group_stack = [root_group]
208 self.group_queue = GroupQueue(root_group)
182 self.group_queue = GroupQueue(root_group)
209 self.indentation = 0
183 self.indentation = 0
210
184
211 def _break_outer_groups(self):
185 def _break_outer_groups(self):
212 while self.max_width < self.output_width + self.buffer_width:
186 while self.max_width < self.output_width + self.buffer_width:
213 group = self.group_queue.deq()
187 group = self.group_queue.deq()
214 if not group:
188 if not group:
215 return
189 return
216 while group.breakables:
190 while group.breakables:
217 x = self.buffer.popleft()
191 x = self.buffer.popleft()
218 self.output_width = x.output(self.output, self.output_width)
192 self.output_width = x.output(self.output, self.output_width)
219 self.buffer_width -= x.width
193 self.buffer_width -= x.width
220 while self.buffer and isinstance(self.buffer[0], Text):
194 while self.buffer and isinstance(self.buffer[0], Text):
221 x = self.buffer.popleft()
195 x = self.buffer.popleft()
222 self.output_width = x.output(self.output, self.output_width)
196 self.output_width = x.output(self.output, self.output_width)
223 self.buffer_width -= x.width
197 self.buffer_width -= x.width
224
198
225 def text(self, obj):
199 def text(self, obj):
226 """Add literal text to the output."""
200 """Add literal text to the output."""
227 width = len(obj)
201 width = len(obj)
228 if self.buffer:
202 if self.buffer:
229 text = self.buffer[-1]
203 text = self.buffer[-1]
230 if not isinstance(text, Text):
204 if not isinstance(text, Text):
231 text = Text()
205 text = Text()
232 self.buffer.append(text)
206 self.buffer.append(text)
233 text.add(obj, width)
207 text.add(obj, width)
234 self.buffer_width += width
208 self.buffer_width += width
235 self._break_outer_groups()
209 self._break_outer_groups()
236 else:
210 else:
237 self.output.write(obj)
211 self.output.write(obj)
238 self.output_width += width
212 self.output_width += width
239
213
240 def breakable(self, sep=' '):
214 def breakable(self, sep=' '):
241 """
215 """
242 Add a breakable separator to the output. This does not mean that it
216 Add a breakable separator to the output. This does not mean that it
243 will automatically break here. If no breaking on this position takes
217 will automatically break here. If no breaking on this position takes
244 place the `sep` is inserted which default to one space.
218 place the `sep` is inserted which default to one space.
245 """
219 """
246 width = len(sep)
220 width = len(sep)
247 group = self.group_stack[-1]
221 group = self.group_stack[-1]
248 if group.want_break:
222 if group.want_break:
249 self.flush()
223 self.flush()
250 self.output.write(self.newline)
224 self.output.write(self.newline)
251 self.output.write(' ' * self.indentation)
225 self.output.write(' ' * self.indentation)
252 self.output_width = self.indentation
226 self.output_width = self.indentation
253 self.buffer_width = 0
227 self.buffer_width = 0
254 else:
228 else:
255 self.buffer.append(Breakable(sep, width, self))
229 self.buffer.append(Breakable(sep, width, self))
256 self.buffer_width += width
230 self.buffer_width += width
257 self._break_outer_groups()
231 self._break_outer_groups()
258
232
259 def break_(self):
233 def break_(self):
260 """
234 """
261 Explicitly insert a newline into the output, maintaining correct indentation.
235 Explicitly insert a newline into the output, maintaining correct indentation.
262 """
236 """
263 self.flush()
237 self.flush()
264 self.output.write(self.newline)
238 self.output.write(self.newline)
265 self.output.write(' ' * self.indentation)
239 self.output.write(' ' * self.indentation)
266 self.output_width = self.indentation
240 self.output_width = self.indentation
267 self.buffer_width = 0
241 self.buffer_width = 0
268
242
269
243
270 def begin_group(self, indent=0, open=''):
244 def begin_group(self, indent=0, open=''):
271 """
245 """
272 Begin a group. If you want support for python < 2.5 which doesn't has
246 Begin a group. If you want support for python < 2.5 which doesn't has
273 the with statement this is the preferred way:
247 the with statement this is the preferred way:
274
248
275 p.begin_group(1, '{')
249 p.begin_group(1, '{')
276 ...
250 ...
277 p.end_group(1, '}')
251 p.end_group(1, '}')
278
252
279 The python 2.5 expression would be this:
253 The python 2.5 expression would be this:
280
254
281 with p.group(1, '{', '}'):
255 with p.group(1, '{', '}'):
282 ...
256 ...
283
257
284 The first parameter specifies the indentation for the next line (usually
258 The first parameter specifies the indentation for the next line (usually
285 the width of the opening text), the second the opening text. All
259 the width of the opening text), the second the opening text. All
286 parameters are optional.
260 parameters are optional.
287 """
261 """
288 if open:
262 if open:
289 self.text(open)
263 self.text(open)
290 group = Group(self.group_stack[-1].depth + 1)
264 group = Group(self.group_stack[-1].depth + 1)
291 self.group_stack.append(group)
265 self.group_stack.append(group)
292 self.group_queue.enq(group)
266 self.group_queue.enq(group)
293 self.indentation += indent
267 self.indentation += indent
294
268
295 def _enumerate(self, seq):
269 def _enumerate(self, seq):
296 """like enumerate, but with an upper limit on the number of items"""
270 """like enumerate, but with an upper limit on the number of items"""
297 for idx, x in enumerate(seq):
271 for idx, x in enumerate(seq):
298 if self.max_seq_length and idx >= self.max_seq_length:
272 if self.max_seq_length and idx >= self.max_seq_length:
299 self.text(',')
273 self.text(',')
300 self.breakable()
274 self.breakable()
301 self.text('...')
275 self.text('...')
302 raise StopIteration
276 raise StopIteration
303 yield idx, x
277 yield idx, x
304
278
305 def end_group(self, dedent=0, close=''):
279 def end_group(self, dedent=0, close=''):
306 """End a group. See `begin_group` for more details."""
280 """End a group. See `begin_group` for more details."""
307 self.indentation -= dedent
281 self.indentation -= dedent
308 group = self.group_stack.pop()
282 group = self.group_stack.pop()
309 if not group.breakables:
283 if not group.breakables:
310 self.group_queue.remove(group)
284 self.group_queue.remove(group)
311 if close:
285 if close:
312 self.text(close)
286 self.text(close)
313
287
314 def flush(self):
288 def flush(self):
315 """Flush data that is left in the buffer."""
289 """Flush data that is left in the buffer."""
316 for data in self.buffer:
290 for data in self.buffer:
317 self.output_width += data.output(self.output, self.output_width)
291 self.output_width += data.output(self.output, self.output_width)
318 self.buffer.clear()
292 self.buffer.clear()
319 self.buffer_width = 0
293 self.buffer_width = 0
320
294
321
295
322 def _get_mro(obj_class):
296 def _get_mro(obj_class):
323 """ Get a reasonable method resolution order of a class and its superclasses
297 """ Get a reasonable method resolution order of a class and its superclasses
324 for both old-style and new-style classes.
298 for both old-style and new-style classes.
325 """
299 """
326 if not hasattr(obj_class, '__mro__'):
300 if not hasattr(obj_class, '__mro__'):
327 # Old-style class. Mix in object to make a fake new-style class.
301 # Old-style class. Mix in object to make a fake new-style class.
328 try:
302 try:
329 obj_class = type(obj_class.__name__, (obj_class, object), {})
303 obj_class = type(obj_class.__name__, (obj_class, object), {})
330 except TypeError:
304 except TypeError:
331 # Old-style extension type that does not descend from object.
305 # Old-style extension type that does not descend from object.
332 # FIXME: try to construct a more thorough MRO.
306 # FIXME: try to construct a more thorough MRO.
333 mro = [obj_class]
307 mro = [obj_class]
334 else:
308 else:
335 mro = obj_class.__mro__[1:-1]
309 mro = obj_class.__mro__[1:-1]
336 else:
310 else:
337 mro = obj_class.__mro__
311 mro = obj_class.__mro__
338 return mro
312 return mro
339
313
340
314
341 class RepresentationPrinter(PrettyPrinter):
315 class RepresentationPrinter(PrettyPrinter):
342 """
316 """
343 Special pretty printer that has a `pretty` method that calls the pretty
317 Special pretty printer that has a `pretty` method that calls the pretty
344 printer for a python object.
318 printer for a python object.
345
319
346 This class stores processing data on `self` so you must *never* use
320 This class stores processing data on `self` so you must *never* use
347 this class in a threaded environment. Always lock it or reinstanciate
321 this class in a threaded environment. Always lock it or reinstanciate
348 it.
322 it.
349
323
350 Instances also have a verbose flag callbacks can access to control their
324 Instances also have a verbose flag callbacks can access to control their
351 output. For example the default instance repr prints all attributes and
325 output. For example the default instance repr prints all attributes and
352 methods that are not prefixed by an underscore if the printer is in
326 methods that are not prefixed by an underscore if the printer is in
353 verbose mode.
327 verbose mode.
354 """
328 """
355
329
356 def __init__(self, output, verbose=False, max_width=79, newline='\n',
330 def __init__(self, output, verbose=False, max_width=79, newline='\n',
357 singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None,
331 singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None,
358 max_seq_length=MAX_SEQ_LENGTH):
332 max_seq_length=MAX_SEQ_LENGTH):
359
333
360 PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length)
334 PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length)
361 self.verbose = verbose
335 self.verbose = verbose
362 self.stack = []
336 self.stack = []
363 if singleton_pprinters is None:
337 if singleton_pprinters is None:
364 singleton_pprinters = _singleton_pprinters.copy()
338 singleton_pprinters = _singleton_pprinters.copy()
365 self.singleton_pprinters = singleton_pprinters
339 self.singleton_pprinters = singleton_pprinters
366 if type_pprinters is None:
340 if type_pprinters is None:
367 type_pprinters = _type_pprinters.copy()
341 type_pprinters = _type_pprinters.copy()
368 self.type_pprinters = type_pprinters
342 self.type_pprinters = type_pprinters
369 if deferred_pprinters is None:
343 if deferred_pprinters is None:
370 deferred_pprinters = _deferred_type_pprinters.copy()
344 deferred_pprinters = _deferred_type_pprinters.copy()
371 self.deferred_pprinters = deferred_pprinters
345 self.deferred_pprinters = deferred_pprinters
372
346
373 def pretty(self, obj):
347 def pretty(self, obj):
374 """Pretty print the given object."""
348 """Pretty print the given object."""
375 obj_id = id(obj)
349 obj_id = id(obj)
376 cycle = obj_id in self.stack
350 cycle = obj_id in self.stack
377 self.stack.append(obj_id)
351 self.stack.append(obj_id)
378 self.begin_group()
352 self.begin_group()
379 try:
353 try:
380 obj_class = _safe_getattr(obj, '__class__', None) or type(obj)
354 obj_class = _safe_getattr(obj, '__class__', None) or type(obj)
381 # First try to find registered singleton printers for the type.
355 # First try to find registered singleton printers for the type.
382 try:
356 try:
383 printer = self.singleton_pprinters[obj_id]
357 printer = self.singleton_pprinters[obj_id]
384 except (TypeError, KeyError):
358 except (TypeError, KeyError):
385 pass
359 pass
386 else:
360 else:
387 return printer(obj, self, cycle)
361 return printer(obj, self, cycle)
388 # Next walk the mro and check for either:
362 # Next walk the mro and check for either:
389 # 1) a registered printer
363 # 1) a registered printer
390 # 2) a _repr_pretty_ method
364 # 2) a _repr_pretty_ method
391 for cls in _get_mro(obj_class):
365 for cls in _get_mro(obj_class):
392 if cls in self.type_pprinters:
366 if cls in self.type_pprinters:
393 # printer registered in self.type_pprinters
367 # printer registered in self.type_pprinters
394 return self.type_pprinters[cls](obj, self, cycle)
368 return self.type_pprinters[cls](obj, self, cycle)
395 else:
369 else:
396 # deferred printer
370 # deferred printer
397 printer = self._in_deferred_types(cls)
371 printer = self._in_deferred_types(cls)
398 if printer is not None:
372 if printer is not None:
399 return printer(obj, self, cycle)
373 return printer(obj, self, cycle)
400 else:
374 else:
401 # Finally look for special method names.
375 # Finally look for special method names.
402 # Some objects automatically create any requested
376 # Some objects automatically create any requested
403 # attribute. Try to ignore most of them by checking for
377 # attribute. Try to ignore most of them by checking for
404 # callability.
378 # callability.
405 if '_repr_pretty_' in cls.__dict__:
379 if '_repr_pretty_' in cls.__dict__:
406 meth = cls._repr_pretty_
380 meth = cls._repr_pretty_
407 if callable(meth):
381 if callable(meth):
408 return meth(obj, self, cycle)
382 return meth(obj, self, cycle)
409 return _default_pprint(obj, self, cycle)
383 return _default_pprint(obj, self, cycle)
410 finally:
384 finally:
411 self.end_group()
385 self.end_group()
412 self.stack.pop()
386 self.stack.pop()
413
387
414 def _in_deferred_types(self, cls):
388 def _in_deferred_types(self, cls):
415 """
389 """
416 Check if the given class is specified in the deferred type registry.
390 Check if the given class is specified in the deferred type registry.
417
391
418 Returns the printer from the registry if it exists, and None if the
392 Returns the printer from the registry if it exists, and None if the
419 class is not in the registry. Successful matches will be moved to the
393 class is not in the registry. Successful matches will be moved to the
420 regular type registry for future use.
394 regular type registry for future use.
421 """
395 """
422 mod = _safe_getattr(cls, '__module__', None)
396 mod = _safe_getattr(cls, '__module__', None)
423 name = _safe_getattr(cls, '__name__', None)
397 name = _safe_getattr(cls, '__name__', None)
424 key = (mod, name)
398 key = (mod, name)
425 printer = None
399 printer = None
426 if key in self.deferred_pprinters:
400 if key in self.deferred_pprinters:
427 # Move the printer over to the regular registry.
401 # Move the printer over to the regular registry.
428 printer = self.deferred_pprinters.pop(key)
402 printer = self.deferred_pprinters.pop(key)
429 self.type_pprinters[cls] = printer
403 self.type_pprinters[cls] = printer
430 return printer
404 return printer
431
405
432
406
433 class Printable(object):
407 class Printable(object):
434
408
435 def output(self, stream, output_width):
409 def output(self, stream, output_width):
436 return output_width
410 return output_width
437
411
438
412
439 class Text(Printable):
413 class Text(Printable):
440
414
441 def __init__(self):
415 def __init__(self):
442 self.objs = []
416 self.objs = []
443 self.width = 0
417 self.width = 0
444
418
445 def output(self, stream, output_width):
419 def output(self, stream, output_width):
446 for obj in self.objs:
420 for obj in self.objs:
447 stream.write(obj)
421 stream.write(obj)
448 return output_width + self.width
422 return output_width + self.width
449
423
450 def add(self, obj, width):
424 def add(self, obj, width):
451 self.objs.append(obj)
425 self.objs.append(obj)
452 self.width += width
426 self.width += width
453
427
454
428
455 class Breakable(Printable):
429 class Breakable(Printable):
456
430
457 def __init__(self, seq, width, pretty):
431 def __init__(self, seq, width, pretty):
458 self.obj = seq
432 self.obj = seq
459 self.width = width
433 self.width = width
460 self.pretty = pretty
434 self.pretty = pretty
461 self.indentation = pretty.indentation
435 self.indentation = pretty.indentation
462 self.group = pretty.group_stack[-1]
436 self.group = pretty.group_stack[-1]
463 self.group.breakables.append(self)
437 self.group.breakables.append(self)
464
438
465 def output(self, stream, output_width):
439 def output(self, stream, output_width):
466 self.group.breakables.popleft()
440 self.group.breakables.popleft()
467 if self.group.want_break:
441 if self.group.want_break:
468 stream.write(self.pretty.newline)
442 stream.write(self.pretty.newline)
469 stream.write(' ' * self.indentation)
443 stream.write(' ' * self.indentation)
470 return self.indentation
444 return self.indentation
471 if not self.group.breakables:
445 if not self.group.breakables:
472 self.pretty.group_queue.remove(self.group)
446 self.pretty.group_queue.remove(self.group)
473 stream.write(self.obj)
447 stream.write(self.obj)
474 return output_width + self.width
448 return output_width + self.width
475
449
476
450
477 class Group(Printable):
451 class Group(Printable):
478
452
479 def __init__(self, depth):
453 def __init__(self, depth):
480 self.depth = depth
454 self.depth = depth
481 self.breakables = deque()
455 self.breakables = deque()
482 self.want_break = False
456 self.want_break = False
483
457
484
458
485 class GroupQueue(object):
459 class GroupQueue(object):
486
460
487 def __init__(self, *groups):
461 def __init__(self, *groups):
488 self.queue = []
462 self.queue = []
489 for group in groups:
463 for group in groups:
490 self.enq(group)
464 self.enq(group)
491
465
492 def enq(self, group):
466 def enq(self, group):
493 depth = group.depth
467 depth = group.depth
494 while depth > len(self.queue) - 1:
468 while depth > len(self.queue) - 1:
495 self.queue.append([])
469 self.queue.append([])
496 self.queue[depth].append(group)
470 self.queue[depth].append(group)
497
471
498 def deq(self):
472 def deq(self):
499 for stack in self.queue:
473 for stack in self.queue:
500 for idx, group in enumerate(reversed(stack)):
474 for idx, group in enumerate(reversed(stack)):
501 if group.breakables:
475 if group.breakables:
502 del stack[idx]
476 del stack[idx]
503 group.want_break = True
477 group.want_break = True
504 return group
478 return group
505 for group in stack:
479 for group in stack:
506 group.want_break = True
480 group.want_break = True
507 del stack[:]
481 del stack[:]
508
482
509 def remove(self, group):
483 def remove(self, group):
510 try:
484 try:
511 self.queue[group.depth].remove(group)
485 self.queue[group.depth].remove(group)
512 except ValueError:
486 except ValueError:
513 pass
487 pass
514
488
515 try:
489 try:
516 _baseclass_reprs = (object.__repr__, types.InstanceType.__repr__)
490 _baseclass_reprs = (object.__repr__, types.InstanceType.__repr__)
517 except AttributeError: # Python 3
491 except AttributeError: # Python 3
518 _baseclass_reprs = (object.__repr__,)
492 _baseclass_reprs = (object.__repr__,)
519
493
520
494
521 def _default_pprint(obj, p, cycle):
495 def _default_pprint(obj, p, cycle):
522 """
496 """
523 The default print function. Used if an object does not provide one and
497 The default print function. Used if an object does not provide one and
524 it's none of the builtin objects.
498 it's none of the builtin objects.
525 """
499 """
526 klass = _safe_getattr(obj, '__class__', None) or type(obj)
500 klass = _safe_getattr(obj, '__class__', None) or type(obj)
527 if _safe_getattr(klass, '__repr__', None) not in _baseclass_reprs:
501 if _safe_getattr(klass, '__repr__', None) not in _baseclass_reprs:
528 # A user-provided repr. Find newlines and replace them with p.break_()
502 # A user-provided repr. Find newlines and replace them with p.break_()
529 _repr_pprint(obj, p, cycle)
503 _repr_pprint(obj, p, cycle)
530 return
504 return
531 p.begin_group(1, '<')
505 p.begin_group(1, '<')
532 p.pretty(klass)
506 p.pretty(klass)
533 p.text(' at 0x%x' % id(obj))
507 p.text(' at 0x%x' % id(obj))
534 if cycle:
508 if cycle:
535 p.text(' ...')
509 p.text(' ...')
536 elif p.verbose:
510 elif p.verbose:
537 first = True
511 first = True
538 for key in dir(obj):
512 for key in dir(obj):
539 if not key.startswith('_'):
513 if not key.startswith('_'):
540 try:
514 try:
541 value = getattr(obj, key)
515 value = getattr(obj, key)
542 except AttributeError:
516 except AttributeError:
543 continue
517 continue
544 if isinstance(value, types.MethodType):
518 if isinstance(value, types.MethodType):
545 continue
519 continue
546 if not first:
520 if not first:
547 p.text(',')
521 p.text(',')
548 p.breakable()
522 p.breakable()
549 p.text(key)
523 p.text(key)
550 p.text('=')
524 p.text('=')
551 step = len(key) + 1
525 step = len(key) + 1
552 p.indentation += step
526 p.indentation += step
553 p.pretty(value)
527 p.pretty(value)
554 p.indentation -= step
528 p.indentation -= step
555 first = False
529 first = False
556 p.end_group(1, '>')
530 p.end_group(1, '>')
557
531
558
532
559 def _seq_pprinter_factory(start, end, basetype):
533 def _seq_pprinter_factory(start, end, basetype):
560 """
534 """
561 Factory that returns a pprint function useful for sequences. Used by
535 Factory that returns a pprint function useful for sequences. Used by
562 the default pprint for tuples, dicts, and lists.
536 the default pprint for tuples, dicts, and lists.
563 """
537 """
564 def inner(obj, p, cycle):
538 def inner(obj, p, cycle):
565 typ = type(obj)
539 typ = type(obj)
566 if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
540 if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
567 # If the subclass provides its own repr, use it instead.
541 # If the subclass provides its own repr, use it instead.
568 return p.text(typ.__repr__(obj))
542 return p.text(typ.__repr__(obj))
569
543
570 if cycle:
544 if cycle:
571 return p.text(start + '...' + end)
545 return p.text(start + '...' + end)
572 step = len(start)
546 step = len(start)
573 p.begin_group(step, start)
547 p.begin_group(step, start)
574 for idx, x in p._enumerate(obj):
548 for idx, x in p._enumerate(obj):
575 if idx:
549 if idx:
576 p.text(',')
550 p.text(',')
577 p.breakable()
551 p.breakable()
578 p.pretty(x)
552 p.pretty(x)
579 if len(obj) == 1 and type(obj) is tuple:
553 if len(obj) == 1 and type(obj) is tuple:
580 # Special case for 1-item tuples.
554 # Special case for 1-item tuples.
581 p.text(',')
555 p.text(',')
582 p.end_group(step, end)
556 p.end_group(step, end)
583 return inner
557 return inner
584
558
585
559
586 def _set_pprinter_factory(start, end, basetype):
560 def _set_pprinter_factory(start, end, basetype):
587 """
561 """
588 Factory that returns a pprint function useful for sets and frozensets.
562 Factory that returns a pprint function useful for sets and frozensets.
589 """
563 """
590 def inner(obj, p, cycle):
564 def inner(obj, p, cycle):
591 typ = type(obj)
565 typ = type(obj)
592 if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
566 if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
593 # If the subclass provides its own repr, use it instead.
567 # If the subclass provides its own repr, use it instead.
594 return p.text(typ.__repr__(obj))
568 return p.text(typ.__repr__(obj))
595
569
596 if cycle:
570 if cycle:
597 return p.text(start + '...' + end)
571 return p.text(start + '...' + end)
598 if len(obj) == 0:
572 if len(obj) == 0:
599 # Special case.
573 # Special case.
600 p.text(basetype.__name__ + '()')
574 p.text(basetype.__name__ + '()')
601 else:
575 else:
602 step = len(start)
576 step = len(start)
603 p.begin_group(step, start)
577 p.begin_group(step, start)
604 # Like dictionary keys, we will try to sort the items if there aren't too many
578 # Like dictionary keys, we will try to sort the items if there aren't too many
605 items = obj
579 items = obj
606 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
580 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
607 try:
581 try:
608 items = sorted(obj)
582 items = sorted(obj)
609 except Exception:
583 except Exception:
610 # Sometimes the items don't sort.
584 # Sometimes the items don't sort.
611 pass
585 pass
612 for idx, x in p._enumerate(items):
586 for idx, x in p._enumerate(items):
613 if idx:
587 if idx:
614 p.text(',')
588 p.text(',')
615 p.breakable()
589 p.breakable()
616 p.pretty(x)
590 p.pretty(x)
617 p.end_group(step, end)
591 p.end_group(step, end)
618 return inner
592 return inner
619
593
620
594
621 def _dict_pprinter_factory(start, end, basetype=None):
595 def _dict_pprinter_factory(start, end, basetype=None):
622 """
596 """
623 Factory that returns a pprint function used by the default pprint of
597 Factory that returns a pprint function used by the default pprint of
624 dicts and dict proxies.
598 dicts and dict proxies.
625 """
599 """
626 def inner(obj, p, cycle):
600 def inner(obj, p, cycle):
627 typ = type(obj)
601 typ = type(obj)
628 if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
602 if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
629 # If the subclass provides its own repr, use it instead.
603 # If the subclass provides its own repr, use it instead.
630 return p.text(typ.__repr__(obj))
604 return p.text(typ.__repr__(obj))
631
605
632 if cycle:
606 if cycle:
633 return p.text('{...}')
607 return p.text('{...}')
634 p.begin_group(1, start)
608 p.begin_group(1, start)
635 keys = obj.keys()
609 keys = obj.keys()
636 # if dict isn't large enough to be truncated, sort keys before displaying
610 # if dict isn't large enough to be truncated, sort keys before displaying
637 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
611 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
638 try:
612 try:
639 keys = sorted(keys)
613 keys = sorted(keys)
640 except Exception:
614 except Exception:
641 # Sometimes the keys don't sort.
615 # Sometimes the keys don't sort.
642 pass
616 pass
643 for idx, key in p._enumerate(keys):
617 for idx, key in p._enumerate(keys):
644 if idx:
618 if idx:
645 p.text(',')
619 p.text(',')
646 p.breakable()
620 p.breakable()
647 p.pretty(key)
621 p.pretty(key)
648 p.text(': ')
622 p.text(': ')
649 p.pretty(obj[key])
623 p.pretty(obj[key])
650 p.end_group(1, end)
624 p.end_group(1, end)
651 return inner
625 return inner
652
626
653
627
654 def _super_pprint(obj, p, cycle):
628 def _super_pprint(obj, p, cycle):
655 """The pprint for the super type."""
629 """The pprint for the super type."""
656 p.begin_group(8, '<super: ')
630 p.begin_group(8, '<super: ')
657 p.pretty(obj.__thisclass__)
631 p.pretty(obj.__thisclass__)
658 p.text(',')
632 p.text(',')
659 p.breakable()
633 p.breakable()
660 p.pretty(obj.__self__)
634 p.pretty(obj.__self__)
661 p.end_group(8, '>')
635 p.end_group(8, '>')
662
636
663
637
664 def _re_pattern_pprint(obj, p, cycle):
638 def _re_pattern_pprint(obj, p, cycle):
665 """The pprint function for regular expression patterns."""
639 """The pprint function for regular expression patterns."""
666 p.text('re.compile(')
640 p.text('re.compile(')
667 pattern = repr(obj.pattern)
641 pattern = repr(obj.pattern)
668 if pattern[:1] in 'uU':
642 if pattern[:1] in 'uU':
669 pattern = pattern[1:]
643 pattern = pattern[1:]
670 prefix = 'ur'
644 prefix = 'ur'
671 else:
645 else:
672 prefix = 'r'
646 prefix = 'r'
673 pattern = prefix + pattern.replace('\\\\', '\\')
647 pattern = prefix + pattern.replace('\\\\', '\\')
674 p.text(pattern)
648 p.text(pattern)
675 if obj.flags:
649 if obj.flags:
676 p.text(',')
650 p.text(',')
677 p.breakable()
651 p.breakable()
678 done_one = False
652 done_one = False
679 for flag in ('TEMPLATE', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL',
653 for flag in ('TEMPLATE', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL',
680 'UNICODE', 'VERBOSE', 'DEBUG'):
654 'UNICODE', 'VERBOSE', 'DEBUG'):
681 if obj.flags & getattr(re, flag):
655 if obj.flags & getattr(re, flag):
682 if done_one:
656 if done_one:
683 p.text('|')
657 p.text('|')
684 p.text('re.' + flag)
658 p.text('re.' + flag)
685 done_one = True
659 done_one = True
686 p.text(')')
660 p.text(')')
687
661
688
662
689 def _type_pprint(obj, p, cycle):
663 def _type_pprint(obj, p, cycle):
690 """The pprint for classes and types."""
664 """The pprint for classes and types."""
691 # Heap allocated types might not have the module attribute,
665 # Heap allocated types might not have the module attribute,
692 # and others may set it to None.
666 # and others may set it to None.
693
667
694 # Checks for a __repr__ override in the metaclass
668 # Checks for a __repr__ override in the metaclass
695 if type(obj).__repr__ is not type.__repr__:
669 if type(obj).__repr__ is not type.__repr__:
696 _repr_pprint(obj, p, cycle)
670 _repr_pprint(obj, p, cycle)
697 return
671 return
698
672
699 mod = _safe_getattr(obj, '__module__', None)
673 mod = _safe_getattr(obj, '__module__', None)
700 name = _safe_getattr(obj, '__qualname__', obj.__name__)
674 name = _safe_getattr(obj, '__qualname__', obj.__name__)
701
675
702 if mod in (None, '__builtin__', 'builtins', 'exceptions'):
676 if mod in (None, '__builtin__', 'builtins', 'exceptions'):
703 p.text(name)
677 p.text(name)
704 else:
678 else:
705 p.text(mod + '.' + name)
679 p.text(mod + '.' + name)
706
680
707
681
708 def _repr_pprint(obj, p, cycle):
682 def _repr_pprint(obj, p, cycle):
709 """A pprint that just redirects to the normal repr function."""
683 """A pprint that just redirects to the normal repr function."""
710 # Find newlines and replace them with p.break_()
684 # Find newlines and replace them with p.break_()
711 output = repr(obj)
685 output = repr(obj)
712 for idx,output_line in enumerate(output.splitlines()):
686 for idx,output_line in enumerate(output.splitlines()):
713 if idx:
687 if idx:
714 p.break_()
688 p.break_()
715 p.text(output_line)
689 p.text(output_line)
716
690
717
691
718 def _function_pprint(obj, p, cycle):
692 def _function_pprint(obj, p, cycle):
719 """Base pprint for all functions and builtin functions."""
693 """Base pprint for all functions and builtin functions."""
720 name = _safe_getattr(obj, '__qualname__', obj.__name__)
694 name = _safe_getattr(obj, '__qualname__', obj.__name__)
721 mod = obj.__module__
695 mod = obj.__module__
722 if mod and mod not in ('__builtin__', 'builtins', 'exceptions'):
696 if mod and mod not in ('__builtin__', 'builtins', 'exceptions'):
723 name = mod + '.' + name
697 name = mod + '.' + name
724 p.text('<function %s>' % name)
698 p.text('<function %s>' % name)
725
699
726
700
727 def _exception_pprint(obj, p, cycle):
701 def _exception_pprint(obj, p, cycle):
728 """Base pprint for all exceptions."""
702 """Base pprint for all exceptions."""
729 name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__)
703 name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__)
730 if obj.__class__.__module__ not in ('exceptions', 'builtins'):
704 if obj.__class__.__module__ not in ('exceptions', 'builtins'):
731 name = '%s.%s' % (obj.__class__.__module__, name)
705 name = '%s.%s' % (obj.__class__.__module__, name)
732 step = len(name) + 1
706 step = len(name) + 1
733 p.begin_group(step, name + '(')
707 p.begin_group(step, name + '(')
734 for idx, arg in enumerate(getattr(obj, 'args', ())):
708 for idx, arg in enumerate(getattr(obj, 'args', ())):
735 if idx:
709 if idx:
736 p.text(',')
710 p.text(',')
737 p.breakable()
711 p.breakable()
738 p.pretty(arg)
712 p.pretty(arg)
739 p.end_group(step, ')')
713 p.end_group(step, ')')
740
714
741
715
742 #: the exception base
716 #: the exception base
743 try:
717 try:
744 _exception_base = BaseException
718 _exception_base = BaseException
745 except NameError:
719 except NameError:
746 _exception_base = Exception
720 _exception_base = Exception
747
721
748
722
749 #: printers for builtin types
723 #: printers for builtin types
750 _type_pprinters = {
724 _type_pprinters = {
751 int: _repr_pprint,
725 int: _repr_pprint,
752 float: _repr_pprint,
726 float: _repr_pprint,
753 str: _repr_pprint,
727 str: _repr_pprint,
754 tuple: _seq_pprinter_factory('(', ')', tuple),
728 tuple: _seq_pprinter_factory('(', ')', tuple),
755 list: _seq_pprinter_factory('[', ']', list),
729 list: _seq_pprinter_factory('[', ']', list),
756 dict: _dict_pprinter_factory('{', '}', dict),
730 dict: _dict_pprinter_factory('{', '}', dict),
757
731
758 set: _set_pprinter_factory('{', '}', set),
732 set: _set_pprinter_factory('{', '}', set),
759 frozenset: _set_pprinter_factory('frozenset({', '})', frozenset),
733 frozenset: _set_pprinter_factory('frozenset({', '})', frozenset),
760 super: _super_pprint,
734 super: _super_pprint,
761 _re_pattern_type: _re_pattern_pprint,
735 _re_pattern_type: _re_pattern_pprint,
762 type: _type_pprint,
736 type: _type_pprint,
763 types.FunctionType: _function_pprint,
737 types.FunctionType: _function_pprint,
764 types.BuiltinFunctionType: _function_pprint,
738 types.BuiltinFunctionType: _function_pprint,
765 types.MethodType: _repr_pprint,
739 types.MethodType: _repr_pprint,
766
740
767 datetime.datetime: _repr_pprint,
741 datetime.datetime: _repr_pprint,
768 datetime.timedelta: _repr_pprint,
742 datetime.timedelta: _repr_pprint,
769 _exception_base: _exception_pprint
743 _exception_base: _exception_pprint
770 }
744 }
771
745
772 try:
746 try:
773 _type_pprinters[types.DictProxyType] = _dict_pprinter_factory('<dictproxy {', '}>')
747 _type_pprinters[types.DictProxyType] = _dict_pprinter_factory('<dictproxy {', '}>')
774 _type_pprinters[types.ClassType] = _type_pprint
748 _type_pprinters[types.ClassType] = _type_pprint
775 _type_pprinters[types.SliceType] = _repr_pprint
749 _type_pprinters[types.SliceType] = _repr_pprint
776 except AttributeError: # Python 3
750 except AttributeError: # Python 3
777 _type_pprinters[slice] = _repr_pprint
751 _type_pprinters[slice] = _repr_pprint
778
752
779 try:
753 try:
780 _type_pprinters[xrange] = _repr_pprint
754 _type_pprinters[xrange] = _repr_pprint
781 _type_pprinters[long] = _repr_pprint
755 _type_pprinters[long] = _repr_pprint
782 _type_pprinters[unicode] = _repr_pprint
756 _type_pprinters[unicode] = _repr_pprint
783 except NameError:
757 except NameError:
784 _type_pprinters[range] = _repr_pprint
758 _type_pprinters[range] = _repr_pprint
785 _type_pprinters[bytes] = _repr_pprint
759 _type_pprinters[bytes] = _repr_pprint
786
760
787 #: printers for types specified by name
761 #: printers for types specified by name
788 _deferred_type_pprinters = {
762 _deferred_type_pprinters = {
789 }
763 }
790
764
791 def for_type(typ, func):
765 def for_type(typ, func):
792 """
766 """
793 Add a pretty printer for a given type.
767 Add a pretty printer for a given type.
794 """
768 """
795 oldfunc = _type_pprinters.get(typ, None)
769 oldfunc = _type_pprinters.get(typ, None)
796 if func is not None:
770 if func is not None:
797 # To support easy restoration of old pprinters, we need to ignore Nones.
771 # To support easy restoration of old pprinters, we need to ignore Nones.
798 _type_pprinters[typ] = func
772 _type_pprinters[typ] = func
799 return oldfunc
773 return oldfunc
800
774
801 def for_type_by_name(type_module, type_name, func):
775 def for_type_by_name(type_module, type_name, func):
802 """
776 """
803 Add a pretty printer for a type specified by the module and name of a type
777 Add a pretty printer for a type specified by the module and name of a type
804 rather than the type object itself.
778 rather than the type object itself.
805 """
779 """
806 key = (type_module, type_name)
780 key = (type_module, type_name)
807 oldfunc = _deferred_type_pprinters.get(key, None)
781 oldfunc = _deferred_type_pprinters.get(key, None)
808 if func is not None:
782 if func is not None:
809 # To support easy restoration of old pprinters, we need to ignore Nones.
783 # To support easy restoration of old pprinters, we need to ignore Nones.
810 _deferred_type_pprinters[key] = func
784 _deferred_type_pprinters[key] = func
811 return oldfunc
785 return oldfunc
812
786
813
787
814 #: printers for the default singletons
788 #: printers for the default singletons
815 _singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis,
789 _singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis,
816 NotImplemented]), _repr_pprint)
790 NotImplemented]), _repr_pprint)
817
791
818
792
819 def _defaultdict_pprint(obj, p, cycle):
793 def _defaultdict_pprint(obj, p, cycle):
820 name = 'defaultdict'
794 name = 'defaultdict'
821 p.begin_group(len(name) + 1, name + '(')
795 with p.group(len(name) + 1, name + '(', ')'):
822 if cycle:
796 if cycle:
823 p.text('...')
797 p.text('...')
824 else:
798 else:
825 p.pretty(obj.default_factory)
799 p.pretty(obj.default_factory)
826 p.text(',')
800 p.text(',')
827 p.breakable()
801 p.breakable()
828 p.pretty(dict(obj))
802 p.pretty(dict(obj))
829 p.end_group(len(name) + 1, ')')
830
803
831 def _ordereddict_pprint(obj, p, cycle):
804 def _ordereddict_pprint(obj, p, cycle):
832 name = 'OrderedDict'
805 name = 'OrderedDict'
833 p.begin_group(len(name) + 1, name + '(')
806 with p.group(len(name) + 1, name + '(', ')'):
834 if cycle:
807 if cycle:
835 p.text('...')
808 p.text('...')
836 elif len(obj):
809 elif len(obj):
837 p.pretty(list(obj.items()))
810 p.pretty(list(obj.items()))
838 p.end_group(len(name) + 1, ')')
839
811
840 def _deque_pprint(obj, p, cycle):
812 def _deque_pprint(obj, p, cycle):
841 name = 'deque'
813 name = 'deque'
842 p.begin_group(len(name) + 1, name + '(')
814 with p.group(len(name) + 1, name + '(', ')'):
843 if cycle:
815 if cycle:
844 p.text('...')
816 p.text('...')
845 else:
817 else:
846 p.pretty(list(obj))
818 p.pretty(list(obj))
847 p.end_group(len(name) + 1, ')')
848
819
849
820
850 def _counter_pprint(obj, p, cycle):
821 def _counter_pprint(obj, p, cycle):
851 name = 'Counter'
822 name = 'Counter'
852 p.begin_group(len(name) + 1, name + '(')
823 with p.group(len(name) + 1, name + '(', ')'):
853 if cycle:
824 if cycle:
854 p.text('...')
825 p.text('...')
855 elif len(obj):
826 elif len(obj):
856 p.pretty(dict(obj))
827 p.pretty(dict(obj))
857 p.end_group(len(name) + 1, ')')
858
828
859 for_type_by_name('collections', 'defaultdict', _defaultdict_pprint)
829 for_type_by_name('collections', 'defaultdict', _defaultdict_pprint)
860 for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint)
830 for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint)
861 for_type_by_name('collections', 'deque', _deque_pprint)
831 for_type_by_name('collections', 'deque', _deque_pprint)
862 for_type_by_name('collections', 'Counter', _counter_pprint)
832 for_type_by_name('collections', 'Counter', _counter_pprint)
863
833
864 if __name__ == '__main__':
834 if __name__ == '__main__':
865 from random import randrange
835 from random import randrange
866 class Foo(object):
836 class Foo(object):
867 def __init__(self):
837 def __init__(self):
868 self.foo = 1
838 self.foo = 1
869 self.bar = re.compile(r'\s+')
839 self.bar = re.compile(r'\s+')
870 self.blub = dict.fromkeys(range(30), randrange(1, 40))
840 self.blub = dict.fromkeys(range(30), randrange(1, 40))
871 self.hehe = 23424.234234
841 self.hehe = 23424.234234
872 self.list = ["blub", "blah", self]
842 self.list = ["blub", "blah", self]
873
843
874 def get_foo(self):
844 def get_foo(self):
875 print("foo")
845 print("foo")
876
846
877 pprint(Foo(), verbose=True)
847 pprint(Foo(), verbose=True)
General Comments 0
You need to be logged in to leave comments. Login now