45 |
45 |
46 def pprint(o, bprefix=False, indent=0): |
46 def pprint(o, bprefix=False, indent=0): |
47 """Pretty print an object.""" |
47 """Pretty print an object.""" |
48 return b''.join(pprintgen(o, bprefix=bprefix, indent=indent)) |
48 return b''.join(pprintgen(o, bprefix=bprefix, indent=indent)) |
49 |
49 |
50 def pprintgen(o, bprefix=False, indent=0, _level=1): |
50 def pprintgen(o, bprefix=False, indent=0, _level=0): |
51 """Pretty print an object to a generator of atoms. |
51 """Pretty print an object to a generator of atoms. |
52 |
52 |
53 ``bprefix`` is a flag influencing whether bytestrings are preferred with |
53 ``bprefix`` is a flag influencing whether bytestrings are preferred with |
54 a ``b''`` prefix. |
54 a ``b''`` prefix. |
55 |
55 |
73 return |
73 return |
74 |
74 |
75 yield '[' |
75 yield '[' |
76 |
76 |
77 if indent: |
77 if indent: |
|
78 _level += 1 |
78 yield '\n' |
79 yield '\n' |
79 yield ' ' * (_level * indent) |
80 yield ' ' * (_level * indent) |
80 |
81 |
81 for i, a in enumerate(o): |
82 for i, a in enumerate(o): |
82 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, |
83 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, |
83 _level=_level + 1): |
84 _level=_level): |
84 yield chunk |
85 yield chunk |
85 |
86 |
86 if i + 1 < len(o): |
87 if i + 1 < len(o): |
87 if indent: |
88 if indent: |
88 yield ',\n' |
89 yield ',\n' |
89 yield ' ' * (_level * indent) |
90 yield ' ' * (_level * indent) |
90 else: |
91 else: |
91 yield ', ' |
92 yield ', ' |
92 |
93 |
93 if indent: |
94 if indent: |
94 yield '\n' |
95 _level -= 1 |
95 yield ' ' * ((_level - 1) * indent) |
96 yield '\n' |
|
97 yield ' ' * (_level * indent) |
96 |
98 |
97 yield ']' |
99 yield ']' |
98 elif isinstance(o, dict): |
100 elif isinstance(o, dict): |
99 if not o: |
101 if not o: |
100 yield '{}' |
102 yield '{}' |
101 return |
103 return |
102 |
104 |
103 yield '{' |
105 yield '{' |
104 |
106 |
105 if indent: |
107 if indent: |
|
108 _level += 1 |
106 yield '\n' |
109 yield '\n' |
107 yield ' ' * (_level * indent) |
110 yield ' ' * (_level * indent) |
108 |
111 |
109 for i, (k, v) in enumerate(sorted(o.items())): |
112 for i, (k, v) in enumerate(sorted(o.items())): |
110 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, |
113 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, |
111 _level=_level + 1): |
114 _level=_level): |
112 yield chunk |
115 yield chunk |
113 |
116 |
114 yield ': ' |
117 yield ': ' |
115 |
118 |
116 for chunk in pprintgen(v, bprefix=bprefix, indent=indent, |
119 for chunk in pprintgen(v, bprefix=bprefix, indent=indent, |
117 _level=_level + 1): |
120 _level=_level): |
118 yield chunk |
121 yield chunk |
119 |
122 |
120 if i + 1 < len(o): |
123 if i + 1 < len(o): |
121 if indent: |
124 if indent: |
122 yield ',\n' |
125 yield ',\n' |
123 yield ' ' * (_level * indent) |
126 yield ' ' * (_level * indent) |
124 else: |
127 else: |
125 yield ', ' |
128 yield ', ' |
126 |
129 |
127 if indent: |
130 if indent: |
128 yield '\n' |
131 _level -= 1 |
129 yield ' ' * ((_level - 1) * indent) |
132 yield '\n' |
|
133 yield ' ' * (_level * indent) |
130 |
134 |
131 yield '}' |
135 yield '}' |
132 elif isinstance(o, set): |
136 elif isinstance(o, set): |
133 if not o: |
137 if not o: |
134 yield 'set([])' |
138 yield 'set([])' |
135 return |
139 return |
136 |
140 |
137 yield 'set([' |
141 yield 'set([' |
138 |
142 |
139 if indent: |
143 if indent: |
|
144 _level += 1 |
140 yield '\n' |
145 yield '\n' |
141 yield ' ' * (_level * indent) |
146 yield ' ' * (_level * indent) |
142 |
147 |
143 for i, k in enumerate(sorted(o)): |
148 for i, k in enumerate(sorted(o)): |
144 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, |
149 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, |
145 _level=_level + 1): |
150 _level=_level): |
146 yield chunk |
151 yield chunk |
147 |
152 |
148 if i + 1 < len(o): |
153 if i + 1 < len(o): |
149 if indent: |
154 if indent: |
150 yield ',\n' |
155 yield ',\n' |
151 yield ' ' * (_level * indent) |
156 yield ' ' * (_level * indent) |
152 else: |
157 else: |
153 yield ', ' |
158 yield ', ' |
154 |
159 |
155 if indent: |
160 if indent: |
156 yield '\n' |
161 _level -= 1 |
157 yield ' ' * ((_level - 1) * indent) |
162 yield '\n' |
|
163 yield ' ' * (_level * indent) |
158 |
164 |
159 yield '])' |
165 yield '])' |
160 elif isinstance(o, tuple): |
166 elif isinstance(o, tuple): |
161 if not o: |
167 if not o: |
162 yield '()' |
168 yield '()' |
163 return |
169 return |
164 |
170 |
165 yield '(' |
171 yield '(' |
166 |
172 |
167 if indent: |
173 if indent: |
|
174 _level += 1 |
168 yield '\n' |
175 yield '\n' |
169 yield ' ' * (_level * indent) |
176 yield ' ' * (_level * indent) |
170 |
177 |
171 for i, a in enumerate(o): |
178 for i, a in enumerate(o): |
172 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, |
179 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, |
173 _level=_level + 1): |
180 _level=_level): |
174 yield chunk |
181 yield chunk |
175 |
182 |
176 if i + 1 < len(o): |
183 if i + 1 < len(o): |
177 if indent: |
184 if indent: |
178 yield ',\n' |
185 yield ',\n' |
179 yield ' ' * (_level * indent) |
186 yield ' ' * (_level * indent) |
180 else: |
187 else: |
181 yield ', ' |
188 yield ', ' |
182 |
189 |
183 if indent: |
190 if indent: |
184 yield '\n' |
191 _level -= 1 |
185 yield ' ' * ((_level - 1) * indent) |
192 yield '\n' |
|
193 yield ' ' * (_level * indent) |
186 |
194 |
187 yield ')' |
195 yield ')' |
188 elif isinstance(o, types.GeneratorType): |
196 elif isinstance(o, types.GeneratorType): |
189 # Special case of empty generator. |
197 # Special case of empty generator. |
190 try: |
198 try: |