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