annotate Demo/parser/pprint.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents c18d52e06238
children 489dca3b54cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # pprint.py
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Author: Fred L. Drake, Jr.
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
4 # fdrake@cnri.reston.va.us, fdrake@intr.net
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 #
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # This is a simple little module I wrote to make life easier. I didn't
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # see anything quite like it in the library, though I may have overlooked
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # something. I wrote this when I was trying to read some heavily nested
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # tuples with fairly non-descriptive content. This is modelled very much
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # after Lisp/Scheme - style pretty-printing of lists. If you find it
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # useful, thank small children who sleep at night.
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 """Support to pretty-print lists, tuples, & dictionaries recursively.
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
14 Very simple, but useful, especially in debugging data structures.
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
15
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
16 Constants
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
17 ---------
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
18
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
19 INDENT_PER_LEVEL
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
20 Amount of indentation to use for each new recursive level. The
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
21 default is 1. This must be a non-negative integer, and may be set
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
22 by the caller before calling pprint().
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
24 MAX_WIDTH
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
25 Maximum width of the display. This is only used if the
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
26 representation *can* be kept less than MAX_WIDTH characters wide.
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
27 May be set by the user before calling pprint().
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
29 TAB_WIDTH
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
30 The width represented by a single tab. This value is typically 8,
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
31 but 4 is the default under MacOS. Can be changed by the user if
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
32 desired, but is probably not a good idea.
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 """
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 INDENT_PER_LEVEL = 1
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 MAX_WIDTH = 80
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 import os
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 TAB_WIDTH = (os.name == 'mac' and 4) or 8
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 del os
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
43 from types import DictType, ListType, TupleType
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
45
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 def _indentation(cols):
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
47 """Create tabbed indentation string.
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
49 cols
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
50 Width of the indentation, in columns.
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
51 """
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 return ((cols / TAB_WIDTH) * '\t') + ((cols % TAB_WIDTH) * ' ')
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 def pprint(seq, stream = None, indent = 0, allowance = 0):
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 """Pretty-print a list, tuple, or dictionary.
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
58 seq
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
59 List, tuple, or dictionary object to be pretty-printed. Other
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
60 object types are permitted by are not specially interpreted.
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
62 stream
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
63 Output stream. If not provided, `sys.stdout' is used. This
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
64 parameter must support the `write()' method with a single
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
65 parameter, which will always be a string. It may be a
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
66 `StringIO.StringIO' object if the result is needed as a
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
67 string.
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
68
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
69 Indentation is done according to `INDENT_PER_LEVEL', which may be
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
70 set to any non-negative integer before calling this function. The
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
71 output written on the stream is a perfectly valid representation
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
72 of the Python object passed in, with indentation to assist
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
73 human-readable interpretation. The output can be used as input
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
74 without error, given readable representations of all elements are
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
75 available via `repr()'. Output is restricted to `MAX_WIDTH'
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
76 columns where possible.
4088
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 """
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 if stream is None:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 import sys
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 stream = sys.stdout
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 rep = `seq`
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 typ = type(seq)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 sepLines = len(rep) > (MAX_WIDTH - 1 - indent - allowance)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
85
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 if sepLines and (typ is ListType or typ is TupleType):
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 # Pretty-print the sequence.
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 stream.write(((typ is ListType) and '[') or '(')
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 length = len(seq)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 if length:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 indent = indent + INDENT_PER_LEVEL
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 pprint(seq[0], stream, indent, allowance + 1)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
94
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 if len(seq) > 1:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 for ent in seq[1:]:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 stream.write(',\n' + _indentation(indent))
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 pprint(ent, stream, indent, allowance + 1)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
99
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 indent = indent - INDENT_PER_LEVEL
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
101
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 stream.write(((typ is ListType) and ']') or ')')
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 elif typ is DictType and sepLines:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 stream.write('{')
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
106
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 length = len(seq)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 if length:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 indent = indent + INDENT_PER_LEVEL
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 items = seq.items()
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 items.sort()
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 key, ent = items[0]
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 rep = `key` + ': '
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 stream.write(rep)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 pprint(ent, stream, indent + len(rep), allowance + 1)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
116
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 if len(items) > 1:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 for key, ent in items[1:]:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 rep = `key` + ': '
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 stream.write(',\n' + _indentation(indent) + rep)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 pprint(ent, stream, indent + len(rep), allowance + 1)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
122
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 indent = indent - INDENT_PER_LEVEL
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 stream.write('}')
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
126
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 else:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 stream.write(rep)
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
129
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 # Terminate the 'print' if we're not a recursive invocation.
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 if not indent:
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 stream.write('\n')
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
133
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
f81d78547f28 Demos for Fred's parser module
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 #
4132
c18d52e06238 Final set of changes by Fred before 1.4beta3
Guido van Rossum <guido@python.org>
parents: 4088
diff changeset
136 # end of file