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