annotate Lib/pprint.py @ 74006:88198b93ff2f

Issue #13560: Add PyUnicode_EncodeLocale() * Use PyUnicode_EncodeLocale() in time.strftime() if wcsftime() is not available * Document my last changes in Misc/NEWS
author Victor Stinner <victor.stinner@haypocalc.com>
date Sat, 17 Dec 2011 04:13:41 +0100
parents 9659e8c40079
children 03cda5360dc6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
1 # Author: Fred L. Drake, Jr.
20348
425c6c558fac Remove obsolete email address.
Fred Drake <fdrake@acm.org>
parents: 19697
diff changeset
2 # fdrake@acm.org
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # This is a simple little module I wrote to make life easier. I didn't
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # see anything quite like it in the library, though I may have overlooked
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # something. I wrote this when I was trying to read some heavily nested
13620
5b727ab37092 Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents: 11620
diff changeset
7 # tuples with fairly non-descriptive content. This is modeled very much
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # after Lisp/Scheme - style pretty-printing of lists. If you find it
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # useful, thank small children who sleep at night.
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 """Support to pretty-print lists, tuples, & dictionaries recursively.
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 Very simple, but useful, especially in debugging data structures.
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
15 Classes
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
16 -------
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
17
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
18 PrettyPrinter()
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
19 Handle pretty-printing operations onto a stream using a configured
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
20 set of formatting parameters.
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
21
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 Functions
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 ---------
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 pformat()
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 Format a Python object into a pretty-printed representation.
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 pprint()
32107
7e3a2c274b36 typo - fixes 954030.
Skip Montanaro <skip@pobox.com>
parents: 31515
diff changeset
29 Pretty-print a Python object to a stream [default is sys.stdout].
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
31 saferepr()
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
32 Generate a 'standard' repr()-like value, but protect against recursive
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
33 data structures.
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 """
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
37 import sys as _sys
64583
9659e8c40079 Have pprint() respect the order in an OrderedDict.
Raymond Hettinger <python@rcn.com>
parents: 57341
diff changeset
38 from collections import OrderedDict as _OrderedDict
42501
f6069f9dd52d SF patch# 1770008 by Christian Heimes (plus some extras).
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
39 from io import StringIO as _StringIO
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
16562
623456576d6a __all__ for several more modules
Skip Montanaro <skip@pobox.com>
parents: 13620
diff changeset
41 __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr",
623456576d6a __all__ for several more modules
Skip Montanaro <skip@pobox.com>
parents: 13620
diff changeset
42 "PrettyPrinter"]
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
44 # cache these for faster access:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
45 _commajoin = ", ".join
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
46 _id = id
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
47 _len = len
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
48 _type = type
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
49
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
50
31085
a2f6c6a67f24 Add parameters indent, width and depth to pprint.pprint() and pprint.pformat()
Walter Dörwald <walter@livinglogic.de>
parents: 31084
diff changeset
51 def pprint(object, stream=None, indent=1, width=80, depth=None):
32107
7e3a2c274b36 typo - fixes 954030.
Skip Montanaro <skip@pobox.com>
parents: 31515
diff changeset
52 """Pretty-print a Python object to a stream [default is sys.stdout]."""
31085
a2f6c6a67f24 Add parameters indent, width and depth to pprint.pprint() and pprint.pformat()
Walter Dörwald <walter@livinglogic.de>
parents: 31084
diff changeset
53 printer = PrettyPrinter(
a2f6c6a67f24 Add parameters indent, width and depth to pprint.pprint() and pprint.pformat()
Walter Dörwald <walter@livinglogic.de>
parents: 31084
diff changeset
54 stream=stream, indent=indent, width=width, depth=depth)
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
55 printer.pprint(object)
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
56
31085
a2f6c6a67f24 Add parameters indent, width and depth to pprint.pprint() and pprint.pformat()
Walter Dörwald <walter@livinglogic.de>
parents: 31084
diff changeset
57 def pformat(object, indent=1, width=80, depth=None):
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
58 """Format a Python object into a pretty-printed representation."""
31085
a2f6c6a67f24 Add parameters indent, width and depth to pprint.pprint() and pprint.pformat()
Walter Dörwald <walter@livinglogic.de>
parents: 31084
diff changeset
59 return PrettyPrinter(indent=indent, width=width, depth=depth).pformat(object)
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
60
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
61 def saferepr(object):
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
62 """Version of repr() which can handle recursive data structures."""
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
63 return _safe_repr(object, {}, None, 0)[0]
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
65 def isreadable(object):
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
66 """Determine if saferepr(object) is readable by eval()."""
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
67 return _safe_repr(object, {}, None, 0)[1]
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
68
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
69 def isrecursive(object):
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
70 """Determine if object requires a recursive representation."""
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
71 return _safe_repr(object, {}, None, 0)[2]
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
57341
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
73 class _safe_key:
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
74 """Helper function for key functions when sorting unorderable objects.
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
75
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
76 The wrapped-object will fallback to an Py2.x style comparison for
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
77 unorderable types (sorting first comparing the type name and then by
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
78 the obj ids). Does not work recursively, so dict.items() must have
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
79 _safe_key applied to both the key and the value.
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
80
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
81 """
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
82
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
83 __slots__ = ['obj']
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
84
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
85 def __init__(self, obj):
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
86 self.obj = obj
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
87
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
88 def __lt__(self, other):
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
89 rv = self.obj.__lt__(other.obj)
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
90 if rv is NotImplemented:
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
91 rv = (str(type(self.obj)), id(self.obj)) < \
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
92 (str(type(other.obj)), id(other.obj))
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
93 return rv
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
94
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
95 def _safe_tuple(t):
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
96 "Helper function for comparing 2-tuples"
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
97 return _safe_key(t[0]), _safe_key(t[1])
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
98
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
99 class PrettyPrinter:
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
100 def __init__(self, indent=1, width=80, depth=None, stream=None):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
101 """Handle pretty printing operations onto a stream using a set of
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
102 configured parameters.
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
104 indent
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
105 Number of spaces to indent for each level of nesting.
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
106
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
107 width
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
108 Attempted maximum number of columns in the output.
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
109
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
110 depth
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
111 The maximum depth to print out nested structures.
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
112
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
113 stream
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
114 The desired output stream. If omitted (or false), the standard
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
115 output stream available at construction will be used.
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
116
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
117 """
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
118 indent = int(indent)
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
119 width = int(width)
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
120 assert indent >= 0, "indent must be >= 0"
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
121 assert depth is None or depth > 0, "depth must be > 0"
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
122 assert width, "width must be != 0"
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
123 self._depth = depth
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
124 self._indent_per_level = indent
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
125 self._width = width
23622
5edd80726d96 Replace boolean test with is None.
Raymond Hettinger <python@rcn.com>
parents: 22867
diff changeset
126 if stream is not None:
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
127 self._stream = stream
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
128 else:
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
129 self._stream = _sys.stdout
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
131 def pprint(self, object):
35852
ee3e0ee1edca Change PrettyPrinter.pprint(), so that output is written directly to the
Walter Dörwald <walter@livinglogic.de>
parents: 33993
diff changeset
132 self._format(object, self._stream, 0, 0, {}, 0)
ee3e0ee1edca Change PrettyPrinter.pprint(), so that output is written directly to the
Walter Dörwald <walter@livinglogic.de>
parents: 33993
diff changeset
133 self._stream.write("\n")
5335
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
134
ee9275b0f5c8 Muchly changed and improved pprint.py:
Fred Drake <fdrake@acm.org>
parents: 5330
diff changeset
135 def pformat(self, object):
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
136 sio = _StringIO()
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
137 self._format(object, sio, 0, 0, {}, 0)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
138 return sio.getvalue()
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
5837
2e917f9372e0 Slight mods to make the module conform to the documentation.
Fred Drake <fdrake@acm.org>
parents: 5337
diff changeset
140 def isrecursive(self, object):
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
141 return self.format(object, {}, 0, 0)[2]
5837
2e917f9372e0 Slight mods to make the module conform to the documentation.
Fred Drake <fdrake@acm.org>
parents: 5337
diff changeset
142
2e917f9372e0 Slight mods to make the module conform to the documentation.
Fred Drake <fdrake@acm.org>
parents: 5337
diff changeset
143 def isreadable(self, object):
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
144 s, readable, recursive = self.format(object, {}, 0, 0)
22766
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
145 return readable and not recursive
5837
2e917f9372e0 Slight mods to make the module conform to the documentation.
Fred Drake <fdrake@acm.org>
parents: 5337
diff changeset
146
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
147 def _format(self, object, stream, indent, allowance, context, level):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
148 level = level + 1
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
149 objid = _id(object)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
150 if objid in context:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
151 stream.write(_recursion(object))
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
152 self._recursive = True
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
153 self._readable = False
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
154 return
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
155 rep = self._repr(object, context, level - 1)
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
156 typ = _type(object)
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
157 sepLines = _len(rep) > (self._width - 1 - indent - allowance)
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
158 write = stream.write
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
47080
58a0d5524f9a Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45067
diff changeset
160 if self._depth and level > self._depth:
58a0d5524f9a Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45067
diff changeset
161 write(rep)
58a0d5524f9a Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45067
diff changeset
162 return
58a0d5524f9a Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45067
diff changeset
163
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
164 if sepLines:
33993
6771e1840bbc Fix pprint to be able to handle objects that don't have a __repr__
Walter Dörwald <walter@livinglogic.de>
parents: 32107
diff changeset
165 r = getattr(typ, "__repr__", None)
64583
9659e8c40079 Have pprint() respect the order in an OrderedDict.
Raymond Hettinger <python@rcn.com>
parents: 57341
diff changeset
166 if issubclass(typ, dict):
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
167 write('{')
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
168 if self._indent_per_level > 1:
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
169 write((self._indent_per_level - 1) * ' ')
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
170 length = _len(object)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
171 if length:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
172 context[objid] = 1
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
173 indent = indent + self._indent_per_level
64583
9659e8c40079 Have pprint() respect the order in an OrderedDict.
Raymond Hettinger <python@rcn.com>
parents: 57341
diff changeset
174 if issubclass(typ, _OrderedDict):
9659e8c40079 Have pprint() respect the order in an OrderedDict.
Raymond Hettinger <python@rcn.com>
parents: 57341
diff changeset
175 items = list(object.items())
9659e8c40079 Have pprint() respect the order in an OrderedDict.
Raymond Hettinger <python@rcn.com>
parents: 57341
diff changeset
176 else:
9659e8c40079 Have pprint() respect the order in an OrderedDict.
Raymond Hettinger <python@rcn.com>
parents: 57341
diff changeset
177 items = sorted(object.items(), key=_safe_tuple)
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
178 key, ent = items[0]
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
179 rep = self._repr(key, context, level)
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
180 write(rep)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
181 write(': ')
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
182 self._format(ent, stream, indent + _len(rep) + 2,
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
183 allowance + 1, context, level)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
184 if length > 1:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
185 for key, ent in items[1:]:
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
186 rep = self._repr(key, context, level)
21061
1802a9edb4ee __format(): Applied SF patch #482003 by Skip to fix multiline dict
Barry Warsaw <barry@python.org>
parents: 20967
diff changeset
187 write(',\n%s%s: ' % (' '*indent, rep))
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
188 self._format(ent, stream, indent + _len(rep) + 2,
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
189 allowance + 1, context, level)
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
190 indent = indent - self._indent_per_level
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
191 del context[objid]
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
192 write('}')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
193 return
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
194
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
195 if ((issubclass(typ, list) and r is list.__repr__) or
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
196 (issubclass(typ, tuple) and r is tuple.__repr__) or
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
197 (issubclass(typ, set) and r is set.__repr__) or
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
198 (issubclass(typ, frozenset) and r is frozenset.__repr__)
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
199 ):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
200 length = _len(object)
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
201 if issubclass(typ, list):
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
202 write('[')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
203 endchar = ']'
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
204 elif issubclass(typ, set):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
205 if not length:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
206 write('set()')
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
207 return
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
208 write('{')
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
209 endchar = '}'
57341
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
210 object = sorted(object, key=_safe_key)
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
211 elif issubclass(typ, frozenset):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
212 if not length:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
213 write('frozenset()')
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
214 return
45067
8930ff230ee9 Update pprint() to match the new repr style for frozensets
Raymond Hettinger <python@rcn.com>
parents: 44943
diff changeset
215 write('frozenset({')
8930ff230ee9 Update pprint() to match the new repr style for frozensets
Raymond Hettinger <python@rcn.com>
parents: 44943
diff changeset
216 endchar = '})'
57341
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
217 object = sorted(object, key=_safe_key)
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
218 indent += 10
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
219 else:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
220 write('(')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
221 endchar = ')'
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
222 if self._indent_per_level > 1:
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
223 write((self._indent_per_level - 1) * ' ')
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
224 if length:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
225 context[objid] = 1
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
226 indent = indent + self._indent_per_level
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
227 self._format(object[0], stream, indent, allowance + 1,
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
228 context, level)
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
229 if length > 1:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
230 for ent in object[1:]:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
231 write(',\n' + ' '*indent)
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
232 self._format(ent, stream, indent,
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
233 allowance + 1, context, level)
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
234 indent = indent - self._indent_per_level
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
235 del context[objid]
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
236 if issubclass(typ, tuple) and length == 1:
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
237 write(',')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
238 write(endchar)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
239 return
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
240
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
241 write(rep)
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
242
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
243 def _repr(self, object, context, level):
22766
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
244 repr, readable, recursive = self.format(object, context.copy(),
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
245 self._depth, level)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
246 if not readable:
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
247 self._readable = False
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
248 if recursive:
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
249 self._recursive = True
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
250 return repr
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
251
22766
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
252 def format(self, object, context, maxlevels, level):
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
253 """Format object for a specific context, returning a string
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
254 and flags indicating whether the representation is 'readable'
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
255 and whether the object represents a recursive construct.
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
256 """
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
257 return _safe_repr(object, context, maxlevels, level)
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
258
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
259
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
260 # Return triple (repr_string, isreadable, isrecursive).
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
261
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
262 def _safe_repr(object, context, maxlevels, level):
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
263 typ = _type(object)
29379
347e7b6dfd53 Revert 1.25, as overloaded __repr__ is not considered.
Martin v. Löwis <martin@v.loewis.de>
parents: 29378
diff changeset
264 if typ is str:
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
265 if 'locale' not in _sys.modules:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31085
diff changeset
266 return repr(object), True, False
19697
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
267 if "'" in object and '"' not in object:
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
268 closure = '"'
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
269 quotes = {'"': '\\"'}
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
270 else:
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
271 closure = "'"
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
272 quotes = {"'": "\\'"}
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
273 qget = quotes.get
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
274 sio = _StringIO()
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
275 write = sio.write
19697
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
276 for char in object:
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
277 if char.isalpha():
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
278 write(char)
19697
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
279 else:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31085
diff changeset
280 write(qget(char, repr(char)[1:-1]))
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
281 return ("%s%s%s" % (closure, sio.getvalue(), closure)), True, False
17828
26745053f840 pprint's workhorse _safe_repr() function took time quadratic in the # of
Tim Peters <tim.peters@gmail.com>
parents: 17820
diff changeset
282
33993
6771e1840bbc Fix pprint to be able to handle objects that don't have a __repr__
Walter Dörwald <walter@livinglogic.de>
parents: 32107
diff changeset
283 r = getattr(typ, "__repr__", None)
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
284 if issubclass(typ, dict) and r is dict.__repr__:
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
285 if not object:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
286 return "{}", True, False
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
287 objid = _id(object)
47080
58a0d5524f9a Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45067
diff changeset
288 if maxlevels and level >= maxlevels:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
289 return "{...}", False, objid in context
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
290 if objid in context:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
291 return _recursion(object), False, True
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
292 context[objid] = 1
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
293 readable = True
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
294 recursive = False
17828
26745053f840 pprint's workhorse _safe_repr() function took time quadratic in the # of
Tim Peters <tim.peters@gmail.com>
parents: 17820
diff changeset
295 components = []
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
296 append = components.append
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
297 level += 1
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
298 saferepr = _safe_repr
57341
b8a0b333e469 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
299 items = sorted(object.items(), key=_safe_tuple)
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
300 for k, v in items:
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
301 krepr, kreadable, krecur = saferepr(k, context, maxlevels, level)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
302 vrepr, vreadable, vrecur = saferepr(v, context, maxlevels, level)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
303 append("%s: %s" % (krepr, vrepr))
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 6312
diff changeset
304 readable = readable and kreadable and vreadable
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
305 if krecur or vrecur:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
306 recursive = True
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
307 del context[objid]
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
308 return "{%s}" % _commajoin(components), readable, recursive
17828
26745053f840 pprint's workhorse _safe_repr() function took time quadratic in the # of
Tim Peters <tim.peters@gmail.com>
parents: 17820
diff changeset
309
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
310 if (issubclass(typ, list) and r is list.__repr__) or \
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
311 (issubclass(typ, tuple) and r is tuple.__repr__):
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
312 if issubclass(typ, list):
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
313 if not object:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
314 return "[]", True, False
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
315 format = "[%s]"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
316 elif _len(object) == 1:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
317 format = "(%s,)"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
318 else:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
319 if not object:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
320 return "()", True, False
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
321 format = "(%s)"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
322 objid = _id(object)
47080
58a0d5524f9a Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45067
diff changeset
323 if maxlevels and level >= maxlevels:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
324 return format % "...", False, objid in context
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
325 if objid in context:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
326 return _recursion(object), False, True
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
327 context[objid] = 1
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
328 readable = True
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
329 recursive = False
17828
26745053f840 pprint's workhorse _safe_repr() function took time quadratic in the # of
Tim Peters <tim.peters@gmail.com>
parents: 17820
diff changeset
330 components = []
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
331 append = components.append
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
332 level += 1
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
333 for o in object:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
334 orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
335 append(orepr)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
336 if not oreadable:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
337 readable = False
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
338 if orecur:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
339 recursive = True
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
340 del context[objid]
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
341 return format % _commajoin(components), readable, recursive
20967
bb8716095a81 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 20819
diff changeset
342
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31085
diff changeset
343 rep = repr(object)
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
344 return rep, (rep and not rep.startswith('<')), False
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
345
17828
26745053f840 pprint's workhorse _safe_repr() function took time quadratic in the # of
Tim Peters <tim.peters@gmail.com>
parents: 17820
diff changeset
346
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
347 def _recursion(object):
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
348 return ("<Recursion on %s with id=%s>"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
349 % (_type(object).__name__, _id(object)))
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
350
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
351
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
352 def _perfcheck(object=None):
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
353 import time
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
354 if object is None:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
355 object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
356 p = PrettyPrinter()
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
357 t1 = time.time()
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
358 _safe_repr(object, {}, None, 0)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
359 t2 = time.time()
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
360 p.pformat(object)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
361 t3 = time.time()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
362 print("_safe_repr:", t2 - t1)
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
363 print("pformat:", t3 - t2)
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
364
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
365 if __name__ == "__main__":
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
366 _perfcheck()