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