Mercurial > cpython-lru_cache-weakref
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 |
| 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 |
