Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/utils/stringutil.py @ 40276:be57c7019c70
stringutil: allow to specify initial indent level of pprint()
I want to pprint() an inner object, which starts with level=1 indent.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 14 Oct 2018 07:23:02 +0200 |
parents | f2fbd32c7664 |
children | e6c9ef5e11a0 |
comparison
equal
deleted
inserted
replaced
40275:f2fbd32c7664 | 40276:be57c7019c70 |
---|---|
41 pat = pat.translate(_regexescapemap) | 41 pat = pat.translate(_regexescapemap) |
42 if wantuni: | 42 if wantuni: |
43 return pat | 43 return pat |
44 return pat.encode('latin1') | 44 return pat.encode('latin1') |
45 | 45 |
46 def pprint(o, bprefix=False, indent=0): | 46 def pprint(o, bprefix=False, indent=0, level=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, level=level)) |
49 | 49 |
50 def pprintgen(o, bprefix=False, indent=0, _level=0): | 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 |
56 ``indent`` controls whether collections and nested data structures | 56 ``indent`` controls whether collections and nested data structures |
57 span multiple lines via the indentation amount in spaces. By default, | 57 span multiple lines via the indentation amount in spaces. By default, |
58 no newlines are emitted. | 58 no newlines are emitted. |
59 | |
60 ``level`` specifies the initial indent level. Used if ``indent > 0``. | |
59 """ | 61 """ |
60 | 62 |
61 if isinstance(o, bytes): | 63 if isinstance(o, bytes): |
62 if bprefix: | 64 if bprefix: |
63 yield "b'%s'" % escapestr(o) | 65 yield "b'%s'" % escapestr(o) |
73 return | 75 return |
74 | 76 |
75 yield '[' | 77 yield '[' |
76 | 78 |
77 if indent: | 79 if indent: |
78 _level += 1 | 80 level += 1 |
79 yield '\n' | 81 yield '\n' |
80 yield ' ' * (_level * indent) | 82 yield ' ' * (level * indent) |
81 | 83 |
82 for i, a in enumerate(o): | 84 for i, a in enumerate(o): |
83 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, | 85 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, |
84 _level=_level): | 86 level=level): |
85 yield chunk | 87 yield chunk |
86 | 88 |
87 if i + 1 < len(o): | 89 if i + 1 < len(o): |
88 if indent: | 90 if indent: |
89 yield ',\n' | 91 yield ',\n' |
90 yield ' ' * (_level * indent) | 92 yield ' ' * (level * indent) |
91 else: | 93 else: |
92 yield ', ' | 94 yield ', ' |
93 | 95 |
94 if indent: | 96 if indent: |
95 _level -= 1 | 97 level -= 1 |
96 yield '\n' | 98 yield '\n' |
97 yield ' ' * (_level * indent) | 99 yield ' ' * (level * indent) |
98 | 100 |
99 yield ']' | 101 yield ']' |
100 elif isinstance(o, dict): | 102 elif isinstance(o, dict): |
101 if not o: | 103 if not o: |
102 yield '{}' | 104 yield '{}' |
103 return | 105 return |
104 | 106 |
105 yield '{' | 107 yield '{' |
106 | 108 |
107 if indent: | 109 if indent: |
108 _level += 1 | 110 level += 1 |
109 yield '\n' | 111 yield '\n' |
110 yield ' ' * (_level * indent) | 112 yield ' ' * (level * indent) |
111 | 113 |
112 for i, (k, v) in enumerate(sorted(o.items())): | 114 for i, (k, v) in enumerate(sorted(o.items())): |
113 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, | 115 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, |
114 _level=_level): | 116 level=level): |
115 yield chunk | 117 yield chunk |
116 | 118 |
117 yield ': ' | 119 yield ': ' |
118 | 120 |
119 for chunk in pprintgen(v, bprefix=bprefix, indent=indent, | 121 for chunk in pprintgen(v, bprefix=bprefix, indent=indent, |
120 _level=_level): | 122 level=level): |
121 yield chunk | 123 yield chunk |
122 | 124 |
123 if i + 1 < len(o): | 125 if i + 1 < len(o): |
124 if indent: | 126 if indent: |
125 yield ',\n' | 127 yield ',\n' |
126 yield ' ' * (_level * indent) | 128 yield ' ' * (level * indent) |
127 else: | 129 else: |
128 yield ', ' | 130 yield ', ' |
129 | 131 |
130 if indent: | 132 if indent: |
131 _level -= 1 | 133 level -= 1 |
132 yield '\n' | 134 yield '\n' |
133 yield ' ' * (_level * indent) | 135 yield ' ' * (level * indent) |
134 | 136 |
135 yield '}' | 137 yield '}' |
136 elif isinstance(o, set): | 138 elif isinstance(o, set): |
137 if not o: | 139 if not o: |
138 yield 'set([])' | 140 yield 'set([])' |
139 return | 141 return |
140 | 142 |
141 yield 'set([' | 143 yield 'set([' |
142 | 144 |
143 if indent: | 145 if indent: |
144 _level += 1 | 146 level += 1 |
145 yield '\n' | 147 yield '\n' |
146 yield ' ' * (_level * indent) | 148 yield ' ' * (level * indent) |
147 | 149 |
148 for i, k in enumerate(sorted(o)): | 150 for i, k in enumerate(sorted(o)): |
149 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, | 151 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, |
150 _level=_level): | 152 level=level): |
151 yield chunk | 153 yield chunk |
152 | 154 |
153 if i + 1 < len(o): | 155 if i + 1 < len(o): |
154 if indent: | 156 if indent: |
155 yield ',\n' | 157 yield ',\n' |
156 yield ' ' * (_level * indent) | 158 yield ' ' * (level * indent) |
157 else: | 159 else: |
158 yield ', ' | 160 yield ', ' |
159 | 161 |
160 if indent: | 162 if indent: |
161 _level -= 1 | 163 level -= 1 |
162 yield '\n' | 164 yield '\n' |
163 yield ' ' * (_level * indent) | 165 yield ' ' * (level * indent) |
164 | 166 |
165 yield '])' | 167 yield '])' |
166 elif isinstance(o, tuple): | 168 elif isinstance(o, tuple): |
167 if not o: | 169 if not o: |
168 yield '()' | 170 yield '()' |
169 return | 171 return |
170 | 172 |
171 yield '(' | 173 yield '(' |
172 | 174 |
173 if indent: | 175 if indent: |
174 _level += 1 | 176 level += 1 |
175 yield '\n' | 177 yield '\n' |
176 yield ' ' * (_level * indent) | 178 yield ' ' * (level * indent) |
177 | 179 |
178 for i, a in enumerate(o): | 180 for i, a in enumerate(o): |
179 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, | 181 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, |
180 _level=_level): | 182 level=level): |
181 yield chunk | 183 yield chunk |
182 | 184 |
183 if i + 1 < len(o): | 185 if i + 1 < len(o): |
184 if indent: | 186 if indent: |
185 yield ',\n' | 187 yield ',\n' |
186 yield ' ' * (_level * indent) | 188 yield ' ' * (level * indent) |
187 else: | 189 else: |
188 yield ', ' | 190 yield ', ' |
189 | 191 |
190 if indent: | 192 if indent: |
191 _level -= 1 | 193 level -= 1 |
192 yield '\n' | 194 yield '\n' |
193 yield ' ' * (_level * indent) | 195 yield ' ' * (level * indent) |
194 | 196 |
195 yield ')' | 197 yield ')' |
196 elif isinstance(o, types.GeneratorType): | 198 elif isinstance(o, types.GeneratorType): |
197 # Special case of empty generator. | 199 # Special case of empty generator. |
198 try: | 200 try: |
202 return | 204 return |
203 | 205 |
204 yield 'gen[' | 206 yield 'gen[' |
205 | 207 |
206 if indent: | 208 if indent: |
207 _level += 1 | 209 level += 1 |
208 yield '\n' | 210 yield '\n' |
209 yield ' ' * (_level * indent) | 211 yield ' ' * (level * indent) |
210 | 212 |
211 last = False | 213 last = False |
212 | 214 |
213 while not last: | 215 while not last: |
214 current = nextitem | 216 current = nextitem |
217 nextitem = next(o) | 219 nextitem = next(o) |
218 except StopIteration: | 220 except StopIteration: |
219 last = True | 221 last = True |
220 | 222 |
221 for chunk in pprintgen(current, bprefix=bprefix, indent=indent, | 223 for chunk in pprintgen(current, bprefix=bprefix, indent=indent, |
222 _level=_level): | 224 level=level): |
223 yield chunk | 225 yield chunk |
224 | 226 |
225 if not last: | 227 if not last: |
226 if indent: | 228 if indent: |
227 yield ',\n' | 229 yield ',\n' |
228 yield ' ' * (_level * indent) | 230 yield ' ' * (level * indent) |
229 else: | 231 else: |
230 yield ', ' | 232 yield ', ' |
231 | 233 |
232 if indent: | 234 if indent: |
233 _level -= 1 | 235 level -= 1 |
234 yield '\n' | 236 yield '\n' |
235 yield ' ' * (_level * indent) | 237 yield ' ' * (level * indent) |
236 | 238 |
237 yield ']' | 239 yield ']' |
238 else: | 240 else: |
239 yield pycompat.byterepr(o) | 241 yield pycompat.byterepr(o) |
240 | 242 |