annotate Lib/pprint.py @ 66978:aed2bbafa550 3.1

Blocked revisions 87324 via svnmerge ........ r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines #10719: restore messages generated on invalid compileall args Before the introduction of filename arguments to compileall it gave semi useful messages about not being able to 'list' names that weren't valid directories. This fix restores that behavior. In addition to the test for this case, the patch also adds a test for the default behavior of compileall when no arguments are provided, and fixes a bug in one of the previously added tests. ........
author R. David Murray <rdmurray@bitdance.com>
date Thu, 16 Dec 2010 19:10:16 +0000
parents b31a33c36f08
children 9659e8c40079
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
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
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
57340
b31a33c36f08 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:
b31a33c36f08 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.
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
75
b31a33c36f08 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
b31a33c36f08 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
b31a33c36f08 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
b31a33c36f08 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.
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
80
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
81 """
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
82
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
83 __slots__ = ['obj']
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
84
b31a33c36f08 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):
b31a33c36f08 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
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
87
b31a33c36f08 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):
b31a33c36f08 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)
b31a33c36f08 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:
b31a33c36f08 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)) < \
b31a33c36f08 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))
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
93 return rv
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
94
b31a33c36f08 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):
b31a33c36f08 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"
b31a33c36f08 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])
b31a33c36f08 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)
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
166 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
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
57340
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
174 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
175 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
176 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
177 write(rep)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
178 write(': ')
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
179 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
180 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
181 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
182 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
183 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
184 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
185 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
186 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
187 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
188 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
189 write('}')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
190 return
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
191
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
192 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
193 (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
194 (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
195 (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
196 ):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
197 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
198 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
199 write('[')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
200 endchar = ']'
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
201 elif issubclass(typ, set):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
202 if not length:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
203 write('set()')
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
204 return
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
205 write('{')
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
206 endchar = '}'
57340
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
207 object = sorted(object, key=_safe_key)
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42501
diff changeset
208 elif issubclass(typ, frozenset):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
209 if not length:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
210 write('frozenset()')
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
211 return
45067
8930ff230ee9 Update pprint() to match the new repr style for frozensets
Raymond Hettinger <python@rcn.com>
parents: 44943
diff changeset
212 write('frozenset({')
8930ff230ee9 Update pprint() to match the new repr style for frozensets
Raymond Hettinger <python@rcn.com>
parents: 44943
diff changeset
213 endchar = '})'
57340
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
214 object = sorted(object, key=_safe_key)
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
215 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
216 else:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
217 write('(')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
218 endchar = ')'
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
219 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
220 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
221 if length:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 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
230 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
231 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
232 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
233 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
234 write(',')
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
235 write(endchar)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
236 return
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
237
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
238 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
239
24131
e5ecef5a123a Change the "__ private" names to "_ protected"; this has been a pain for
Fred Drake <fdrake@acm.org>
parents: 23622
diff changeset
240 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
241 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
242 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
243 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
244 self._readable = False
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
245 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
246 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
247 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
248
22766
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
249 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
250 """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
251 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
252 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
253 """
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
254 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
255
d26d8575ac62 Add an experimental mechanism to support extending the pprint formatting.
Fred Drake <fdrake@acm.org>
parents: 21061
diff changeset
256
17820
4bcf88e4abff SF bug[ #423781: pprint.isrecursive() broken.
Tim Peters <tim.peters@gmail.com>
parents: 16562
diff changeset
257 # 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
258
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
259 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
260 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
261 if typ is str:
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
262 if 'locale' not in _sys.modules:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31085
diff changeset
263 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
264 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
265 closure = '"'
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
266 quotes = {'"': '\\"'}
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
267 else:
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 = {"'": "\\'"}
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
270 qget = quotes.get
26929
ffa4ab37036f - PrettyPrinter.isreadable(), .isrecursive():
Fred Drake <fdrake@acm.org>
parents: 24131
diff changeset
271 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
272 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
273 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
274 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
275 write(char)
19697
bc6bd35f5998 Make pprint more locale-friendly; patch contributed by Denis S. Otkidach.
Fred Drake <fdrake@acm.org>
parents: 17828
diff changeset
276 else:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31085
diff changeset
277 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
278 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
279
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
280 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
281 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
282 if not object:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
283 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
284 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
285 if maxlevels and level >= maxlevels:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
286 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
287 if objid in context:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
288 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
289 context[objid] = 1
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
290 readable = True
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
291 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
292 components = []
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
293 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
294 level += 1
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
295 saferepr = _safe_repr
57340
b31a33c36f08 Issue 3976: fix pprint for sets, frozensets, and dicts containing unorderable types.
Raymond Hettinger <python@rcn.com>
parents: 47080
diff changeset
296 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
297 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
298 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
299 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
300 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
301 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
302 if krecur or vrecur:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
303 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
304 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
305 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
306
31084
e3025fe70d8b Patch #750542: pprint now will pretty print subclasses of list, tuple
Walter Dörwald <walter@livinglogic.de>
parents: 29379
diff changeset
307 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
308 (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
309 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
310 if not object:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
311 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
312 format = "[%s]"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
313 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
314 format = "(%s,)"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
315 else:
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
316 if not object:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
317 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
318 format = "(%s)"
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
319 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
320 if maxlevels and level >= maxlevels:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
321 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
322 if objid in context:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
323 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
324 context[objid] = 1
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
325 readable = True
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
326 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
327 components = []
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
328 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
329 level += 1
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
330 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
331 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
332 append(orepr)
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
333 if not oreadable:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
334 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
335 if orecur:
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
336 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
337 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
338 return format % _commajoin(components), readable, recursive
20967
bb8716095a81 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 20819
diff changeset
339
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31085
diff changeset
340 rep = repr(object)
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22766
diff changeset
341 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
342
17828
26745053f840 pprint's workhorse _safe_repr() function took time quadratic in the # of
Tim Peters <tim.peters@gmail.com>
parents: 17820
diff changeset
343
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
344 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
345 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
346 % (_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
347
5330
5a22f9b38aac Checking in a copy of Fred Drake's data structure pretty-printer
Guido van Rossum <guido@python.org>
parents:
diff changeset
348
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
349 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
350 import time
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
351 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
352 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
353 p = PrettyPrinter()
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
354 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
355 _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
356 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
357 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
358 t3 = time.time()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
359 print("_safe_repr:", t2 - t1)
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
360 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
361
20819
261a70c0aa79 Brute-force performance hackery; buys back about 20% of the time for
Fred Drake <fdrake@acm.org>
parents: 20348
diff changeset
362 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
363 _perfcheck()