##// END OF EJS Templates
Whitespace fixes
luz.paz -
Show More
@@ -1,161 +1,161 b''
1 1 """Compiler tools with improved interactive support.
2 2
3 3 Provides compilation machinery similar to codeop, but with caching support so
4 4 we can provide interactive tracebacks.
5 5
6 6 Authors
7 7 -------
8 8 * Robert Kern
9 9 * Fernando Perez
10 10 * Thomas Kluyver
11 11 """
12 12
13 13 # Note: though it might be more natural to name this module 'compiler', that
14 14 # name is in the stdlib and name collisions with the stdlib tend to produce
15 15 # weird problems (often with third-party tools).
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Copyright (C) 2010-2011 The IPython Development Team.
19 19 #
20 20 # Distributed under the terms of the BSD License.
21 21 #
22 22 # The full license is in the file COPYING.txt, distributed with this software.
23 23 #-----------------------------------------------------------------------------
24 24
25 25 #-----------------------------------------------------------------------------
26 26 # Imports
27 27 #-----------------------------------------------------------------------------
28 28
29 29 # Stdlib imports
30 30 import __future__
31 31 from ast import PyCF_ONLY_AST
32 32 import codeop
33 33 import functools
34 34 import hashlib
35 35 import linecache
36 36 import operator
37 37 import time
38 38
39 39 #-----------------------------------------------------------------------------
40 40 # Constants
41 41 #-----------------------------------------------------------------------------
42 42
43 43 # Roughly equal to PyCF_MASK | PyCF_MASK_OBSOLETE as defined in pythonrun.h,
44 44 # this is used as a bitmask to extract future-related code flags.
45 45 PyCF_MASK = functools.reduce(operator.or_,
46 46 (getattr(__future__, fname).compiler_flag
47 47 for fname in __future__.all_feature_names))
48 48
49 49 #-----------------------------------------------------------------------------
50 50 # Local utilities
51 51 #-----------------------------------------------------------------------------
52 52
53 53 def code_name(code, number=0):
54 54 """ Compute a (probably) unique name for code for caching.
55
55
56 56 This now expects code to be unicode.
57 57 """
58 58 hash_digest = hashlib.sha1(code.encode("utf-8")).hexdigest()
59 59 # Include the number and 12 characters of the hash in the name. It's
60 60 # pretty much impossible that in a single session we'll have collisions
61 61 # even with truncated hashes, and the full one makes tracebacks too long
62 62 return '<ipython-input-{0}-{1}>'.format(number, hash_digest[:12])
63 63
64 64 #-----------------------------------------------------------------------------
65 65 # Classes and functions
66 66 #-----------------------------------------------------------------------------
67 67
68 68 class CachingCompiler(codeop.Compile):
69 69 """A compiler that caches code compiled from interactive statements.
70 70 """
71 71
72 72 def __init__(self):
73 73 codeop.Compile.__init__(self)
74
74
75 75 # This is ugly, but it must be done this way to allow multiple
76 76 # simultaneous ipython instances to coexist. Since Python itself
77 77 # directly accesses the data structures in the linecache module, and
78 78 # the cache therein is global, we must work with that data structure.
79 79 # We must hold a reference to the original checkcache routine and call
80 80 # that in our own check_cache() below, but the special IPython cache
81 81 # must also be shared by all IPython instances. If we were to hold
82 82 # separate caches (one in each CachingCompiler instance), any call made
83 83 # by Python itself to linecache.checkcache() would obliterate the
84 84 # cached data from the other IPython instances.
85 85 if not hasattr(linecache, '_ipython_cache'):
86 86 linecache._ipython_cache = {}
87 87 if not hasattr(linecache, '_checkcache_ori'):
88 88 linecache._checkcache_ori = linecache.checkcache
89 89 # Now, we must monkeypatch the linecache directly so that parts of the
90 90 # stdlib that call it outside our control go through our codepath
91 91 # (otherwise we'd lose our tracebacks).
92 92 linecache.checkcache = check_linecache_ipython
93 93
94 94
95 95 def _fix_module_ds(self, module):
96 96 """
97 97 Starting in python 3.7 the AST for mule have changed, and if
98 the first expressions encountered is a string it is attached to the
98 the first expressions encountered is a string it is attached to the
99 99 `docstring` attribute of the `Module` ast node.
100 100
101 101 This breaks IPython, as if this string is the only expression, IPython
102 102 will not return it as the result of the current cell.
103 103 """
104 104 from ast import Str, Expr, Module, fix_missing_locations
105 105 docstring = getattr(module, 'docstring', None)
106 106 if not docstring:
107 107 return module
108 108 new_body=[Expr(Str(docstring, lineno=1, col_offset=0), lineno=1, col_offset=0)]
109 109 new_body.extend(module.body)
110 110 return fix_missing_locations(Module(new_body))
111
111
112 112 def ast_parse(self, source, filename='<unknown>', symbol='exec'):
113 113 """Parse code to an AST with the current compiler flags active.
114
114
115 115 Arguments are exactly the same as ast.parse (in the standard library),
116 116 and are passed to the built-in compile function."""
117 117 return self._fix_module_ds(compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1))
118
118
119 119 def reset_compiler_flags(self):
120 120 """Reset compiler flags to default state."""
121 121 # This value is copied from codeop.Compile.__init__, so if that ever
122 122 # changes, it will need to be updated.
123 123 self.flags = codeop.PyCF_DONT_IMPLY_DEDENT
124 124
125 125 @property
126 126 def compiler_flags(self):
127 127 """Flags currently active in the compilation process.
128 128 """
129 129 return self.flags
130
130
131 131 def cache(self, code, number=0):
132 132 """Make a name for a block of code, and cache the code.
133
133
134 134 Parameters
135 135 ----------
136 136 code : str
137 137 The Python source code to cache.
138 138 number : int
139 139 A number which forms part of the code's name. Used for the execution
140 140 counter.
141
141
142 142 Returns
143 143 -------
144 144 The name of the cached code (as a string). Pass this as the filename
145 145 argument to compilation, so that tracebacks are correctly hooked up.
146 146 """
147 147 name = code_name(code, number)
148 148 entry = (len(code), time.time(),
149 149 [line+'\n' for line in code.splitlines()], name)
150 150 linecache.cache[name] = entry
151 151 linecache._ipython_cache[name] = entry
152 152 return name
153 153
154 154 def check_linecache_ipython(*args):
155 155 """Call linecache.checkcache() safely protecting our cached values.
156 156 """
157 157 # First call the original checkcache as intended
158 158 linecache._checkcache_ori(*args)
159 159 # Then, update back the cache with our data, so that tracebacks related
160 160 # to our compiled codes can be produced.
161 161 linecache.cache.update(linecache._ipython_cache)
@@ -1,871 +1,871 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Python advanced pretty printer. This pretty printer is intended to
4 4 replace the old `pprint` python module which does not allow developers
5 5 to provide their own pretty print callbacks.
6 6
7 7 This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`.
8 8
9 9
10 10 Example Usage
11 11 -------------
12 12
13 13 To directly print the representation of an object use `pprint`::
14 14
15 15 from pretty import pprint
16 16 pprint(complex_object)
17 17
18 18 To get a string of the output use `pretty`::
19 19
20 20 from pretty import pretty
21 21 string = pretty(complex_object)
22 22
23 23
24 24 Extending
25 25 ---------
26 26
27 27 The pretty library allows developers to add pretty printing rules for their
28 28 own objects. This process is straightforward. All you have to do is to
29 29 add a `_repr_pretty_` method to your object and call the methods on the
30 30 pretty printer passed::
31 31
32 32 class MyObject(object):
33 33
34 34 def _repr_pretty_(self, p, cycle):
35 35 ...
36 36
37 37 Here is an example implementation of a `_repr_pretty_` method for a list
38 38 subclass::
39 39
40 40 class MyList(list):
41 41
42 42 def _repr_pretty_(self, p, cycle):
43 43 if cycle:
44 44 p.text('MyList(...)')
45 45 else:
46 46 with p.group(8, 'MyList([', '])'):
47 47 for idx, item in enumerate(self):
48 48 if idx:
49 49 p.text(',')
50 50 p.breakable()
51 51 p.pretty(item)
52 52
53 53 The `cycle` parameter is `True` if pretty detected a cycle. You *have* to
54 54 react to that or the result is an infinite loop. `p.text()` just adds
55 55 non breaking text to the output, `p.breakable()` either adds a whitespace
56 56 or breaks here. If you pass it an argument it's used instead of the
57 57 default space. `p.pretty` prettyprints another object using the pretty print
58 58 method.
59 59
60 60 The first parameter to the `group` function specifies the extra indentation
61 61 of the next line. In this example the next item will either be on the same
62 62 line (if the items are short enough) or aligned with the right edge of the
63 63 opening bracket of `MyList`.
64 64
65 65 If you just want to indent something you can use the group function
66 66 without open / close parameters. You can also use this code::
67 67
68 68 with p.indent(2):
69 69 ...
70 70
71 71 Inheritance diagram:
72 72
73 73 .. inheritance-diagram:: IPython.lib.pretty
74 74 :parts: 3
75 75
76 76 :copyright: 2007 by Armin Ronacher.
77 77 Portions (c) 2009 by Robert Kern.
78 78 :license: BSD License.
79 79 """
80 80
81 81 from contextlib import contextmanager
82 82 import datetime
83 83 import os
84 84 import re
85 85 import sys
86 86 import types
87 87 from collections import deque
88 88 from inspect import signature
89 89 from io import StringIO
90 90 from warnings import warn
91 91
92 92 from IPython.utils.decorators import undoc
93 93 from IPython.utils.py3compat import PYPY
94 94
95 95 __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
96 96 'for_type', 'for_type_by_name']
97 97
98 98
99 99 MAX_SEQ_LENGTH = 1000
100 100 # The language spec says that dicts preserve order from 3.7, but CPython
101 101 # does so from 3.6, so it seems likely that people will expect that.
102 102 DICT_IS_ORDERED = sys.version_info >= (3, 6)
103 103 _re_pattern_type = type(re.compile(''))
104 104
105 105 def _safe_getattr(obj, attr, default=None):
106 106 """Safe version of getattr.
107
107
108 108 Same as getattr, but will return ``default`` on any Exception,
109 109 rather than raising.
110 110 """
111 111 try:
112 112 return getattr(obj, attr, default)
113 113 except Exception:
114 114 return default
115 115
116 116 @undoc
117 117 class CUnicodeIO(StringIO):
118 118 def __init__(self, *args, **kwargs):
119 119 super().__init__(*args, **kwargs)
120 120 warn(("CUnicodeIO is deprecated since IPython 6.0. "
121 121 "Please use io.StringIO instead."),
122 122 DeprecationWarning, stacklevel=2)
123 123
124 124 def _sorted_for_pprint(items):
125 125 """
126 126 Sort the given items for pretty printing. Since some predictable
127 127 sorting is better than no sorting at all, we sort on the string
128 128 representation if normal sorting fails.
129 129 """
130 130 items = list(items)
131 131 try:
132 132 return sorted(items)
133 133 except Exception:
134 134 try:
135 135 return sorted(items, key=str)
136 136 except Exception:
137 137 return items
138 138
139 139 def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
140 140 """
141 141 Pretty print the object's representation.
142 142 """
143 143 stream = StringIO()
144 144 printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length=max_seq_length)
145 145 printer.pretty(obj)
146 146 printer.flush()
147 147 return stream.getvalue()
148 148
149 149
150 150 def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
151 151 """
152 152 Like `pretty` but print to stdout.
153 153 """
154 154 printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length=max_seq_length)
155 155 printer.pretty(obj)
156 156 printer.flush()
157 157 sys.stdout.write(newline)
158 158 sys.stdout.flush()
159 159
160 160 class _PrettyPrinterBase(object):
161 161
162 162 @contextmanager
163 163 def indent(self, indent):
164 164 """with statement support for indenting/dedenting."""
165 165 self.indentation += indent
166 166 try:
167 167 yield
168 168 finally:
169 169 self.indentation -= indent
170 170
171 171 @contextmanager
172 172 def group(self, indent=0, open='', close=''):
173 173 """like begin_group / end_group but for the with statement."""
174 174 self.begin_group(indent, open)
175 175 try:
176 176 yield
177 177 finally:
178 178 self.end_group(indent, close)
179 179
180 180 class PrettyPrinter(_PrettyPrinterBase):
181 181 """
182 182 Baseclass for the `RepresentationPrinter` prettyprinter that is used to
183 183 generate pretty reprs of objects. Contrary to the `RepresentationPrinter`
184 184 this printer knows nothing about the default pprinters or the `_repr_pretty_`
185 185 callback method.
186 186 """
187 187
188 188 def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
189 189 self.output = output
190 190 self.max_width = max_width
191 191 self.newline = newline
192 192 self.max_seq_length = max_seq_length
193 193 self.output_width = 0
194 194 self.buffer_width = 0
195 195 self.buffer = deque()
196 196
197 197 root_group = Group(0)
198 198 self.group_stack = [root_group]
199 199 self.group_queue = GroupQueue(root_group)
200 200 self.indentation = 0
201 201
202 202 def _break_outer_groups(self):
203 203 while self.max_width < self.output_width + self.buffer_width:
204 204 group = self.group_queue.deq()
205 205 if not group:
206 206 return
207 207 while group.breakables:
208 208 x = self.buffer.popleft()
209 209 self.output_width = x.output(self.output, self.output_width)
210 210 self.buffer_width -= x.width
211 211 while self.buffer and isinstance(self.buffer[0], Text):
212 212 x = self.buffer.popleft()
213 213 self.output_width = x.output(self.output, self.output_width)
214 214 self.buffer_width -= x.width
215 215
216 216 def text(self, obj):
217 217 """Add literal text to the output."""
218 218 width = len(obj)
219 219 if self.buffer:
220 220 text = self.buffer[-1]
221 221 if not isinstance(text, Text):
222 222 text = Text()
223 223 self.buffer.append(text)
224 224 text.add(obj, width)
225 225 self.buffer_width += width
226 226 self._break_outer_groups()
227 227 else:
228 228 self.output.write(obj)
229 229 self.output_width += width
230 230
231 231 def breakable(self, sep=' '):
232 232 """
233 233 Add a breakable separator to the output. This does not mean that it
234 234 will automatically break here. If no breaking on this position takes
235 235 place the `sep` is inserted which default to one space.
236 236 """
237 237 width = len(sep)
238 238 group = self.group_stack[-1]
239 239 if group.want_break:
240 240 self.flush()
241 241 self.output.write(self.newline)
242 242 self.output.write(' ' * self.indentation)
243 243 self.output_width = self.indentation
244 244 self.buffer_width = 0
245 245 else:
246 246 self.buffer.append(Breakable(sep, width, self))
247 247 self.buffer_width += width
248 248 self._break_outer_groups()
249
249
250 250 def break_(self):
251 251 """
252 252 Explicitly insert a newline into the output, maintaining correct indentation.
253 253 """
254 254 self.flush()
255 255 self.output.write(self.newline)
256 256 self.output.write(' ' * self.indentation)
257 257 self.output_width = self.indentation
258 258 self.buffer_width = 0
259
259
260 260
261 261 def begin_group(self, indent=0, open=''):
262 262 """
263 263 Begin a group. If you want support for python < 2.5 which doesn't has
264 264 the with statement this is the preferred way:
265 265
266 266 p.begin_group(1, '{')
267 267 ...
268 268 p.end_group(1, '}')
269 269
270 270 The python 2.5 expression would be this:
271 271
272 272 with p.group(1, '{', '}'):
273 273 ...
274 274
275 275 The first parameter specifies the indentation for the next line (usually
276 276 the width of the opening text), the second the opening text. All
277 277 parameters are optional.
278 278 """
279 279 if open:
280 280 self.text(open)
281 281 group = Group(self.group_stack[-1].depth + 1)
282 282 self.group_stack.append(group)
283 283 self.group_queue.enq(group)
284 284 self.indentation += indent
285
285
286 286 def _enumerate(self, seq):
287 287 """like enumerate, but with an upper limit on the number of items"""
288 288 for idx, x in enumerate(seq):
289 289 if self.max_seq_length and idx >= self.max_seq_length:
290 290 self.text(',')
291 291 self.breakable()
292 292 self.text('...')
293 293 return
294 294 yield idx, x
295
295
296 296 def end_group(self, dedent=0, close=''):
297 297 """End a group. See `begin_group` for more details."""
298 298 self.indentation -= dedent
299 299 group = self.group_stack.pop()
300 300 if not group.breakables:
301 301 self.group_queue.remove(group)
302 302 if close:
303 303 self.text(close)
304 304
305 305 def flush(self):
306 306 """Flush data that is left in the buffer."""
307 307 for data in self.buffer:
308 308 self.output_width += data.output(self.output, self.output_width)
309 309 self.buffer.clear()
310 310 self.buffer_width = 0
311 311
312 312
313 313 def _get_mro(obj_class):
314 314 """ Get a reasonable method resolution order of a class and its superclasses
315 315 for both old-style and new-style classes.
316 316 """
317 317 if not hasattr(obj_class, '__mro__'):
318 318 # Old-style class. Mix in object to make a fake new-style class.
319 319 try:
320 320 obj_class = type(obj_class.__name__, (obj_class, object), {})
321 321 except TypeError:
322 322 # Old-style extension type that does not descend from object.
323 323 # FIXME: try to construct a more thorough MRO.
324 324 mro = [obj_class]
325 325 else:
326 326 mro = obj_class.__mro__[1:-1]
327 327 else:
328 328 mro = obj_class.__mro__
329 329 return mro
330 330
331 331
332 332 class RepresentationPrinter(PrettyPrinter):
333 333 """
334 334 Special pretty printer that has a `pretty` method that calls the pretty
335 335 printer for a python object.
336 336
337 337 This class stores processing data on `self` so you must *never* use
338 338 this class in a threaded environment. Always lock it or reinstanciate
339 339 it.
340 340
341 341 Instances also have a verbose flag callbacks can access to control their
342 342 output. For example the default instance repr prints all attributes and
343 343 methods that are not prefixed by an underscore if the printer is in
344 344 verbose mode.
345 345 """
346 346
347 347 def __init__(self, output, verbose=False, max_width=79, newline='\n',
348 348 singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None,
349 349 max_seq_length=MAX_SEQ_LENGTH):
350 350
351 351 PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length)
352 352 self.verbose = verbose
353 353 self.stack = []
354 354 if singleton_pprinters is None:
355 355 singleton_pprinters = _singleton_pprinters.copy()
356 356 self.singleton_pprinters = singleton_pprinters
357 357 if type_pprinters is None:
358 358 type_pprinters = _type_pprinters.copy()
359 359 self.type_pprinters = type_pprinters
360 360 if deferred_pprinters is None:
361 361 deferred_pprinters = _deferred_type_pprinters.copy()
362 362 self.deferred_pprinters = deferred_pprinters
363 363
364 364 def pretty(self, obj):
365 365 """Pretty print the given object."""
366 366 obj_id = id(obj)
367 367 cycle = obj_id in self.stack
368 368 self.stack.append(obj_id)
369 369 self.begin_group()
370 370 try:
371 371 obj_class = _safe_getattr(obj, '__class__', None) or type(obj)
372 372 # First try to find registered singleton printers for the type.
373 373 try:
374 374 printer = self.singleton_pprinters[obj_id]
375 375 except (TypeError, KeyError):
376 376 pass
377 377 else:
378 378 return printer(obj, self, cycle)
379 379 # Next walk the mro and check for either:
380 380 # 1) a registered printer
381 381 # 2) a _repr_pretty_ method
382 382 for cls in _get_mro(obj_class):
383 383 if cls in self.type_pprinters:
384 384 # printer registered in self.type_pprinters
385 385 return self.type_pprinters[cls](obj, self, cycle)
386 386 else:
387 387 # deferred printer
388 388 printer = self._in_deferred_types(cls)
389 389 if printer is not None:
390 390 return printer(obj, self, cycle)
391 391 else:
392 392 # Finally look for special method names.
393 393 # Some objects automatically create any requested
394 394 # attribute. Try to ignore most of them by checking for
395 395 # callability.
396 396 if '_repr_pretty_' in cls.__dict__:
397 397 meth = cls._repr_pretty_
398 398 if callable(meth):
399 399 return meth(obj, self, cycle)
400 400 if cls is not object \
401 401 and callable(cls.__dict__.get('__repr__')):
402 402 return _repr_pprint(obj, self, cycle)
403 403
404 404 return _default_pprint(obj, self, cycle)
405 405 finally:
406 406 self.end_group()
407 407 self.stack.pop()
408 408
409 409 def _in_deferred_types(self, cls):
410 410 """
411 411 Check if the given class is specified in the deferred type registry.
412 412
413 413 Returns the printer from the registry if it exists, and None if the
414 414 class is not in the registry. Successful matches will be moved to the
415 415 regular type registry for future use.
416 416 """
417 417 mod = _safe_getattr(cls, '__module__', None)
418 418 name = _safe_getattr(cls, '__name__', None)
419 419 key = (mod, name)
420 420 printer = None
421 421 if key in self.deferred_pprinters:
422 422 # Move the printer over to the regular registry.
423 423 printer = self.deferred_pprinters.pop(key)
424 424 self.type_pprinters[cls] = printer
425 425 return printer
426 426
427 427
428 428 class Printable(object):
429 429
430 430 def output(self, stream, output_width):
431 431 return output_width
432 432
433 433
434 434 class Text(Printable):
435 435
436 436 def __init__(self):
437 437 self.objs = []
438 438 self.width = 0
439 439
440 440 def output(self, stream, output_width):
441 441 for obj in self.objs:
442 442 stream.write(obj)
443 443 return output_width + self.width
444 444
445 445 def add(self, obj, width):
446 446 self.objs.append(obj)
447 447 self.width += width
448 448
449 449
450 450 class Breakable(Printable):
451 451
452 452 def __init__(self, seq, width, pretty):
453 453 self.obj = seq
454 454 self.width = width
455 455 self.pretty = pretty
456 456 self.indentation = pretty.indentation
457 457 self.group = pretty.group_stack[-1]
458 458 self.group.breakables.append(self)
459 459
460 460 def output(self, stream, output_width):
461 461 self.group.breakables.popleft()
462 462 if self.group.want_break:
463 463 stream.write(self.pretty.newline)
464 464 stream.write(' ' * self.indentation)
465 465 return self.indentation
466 466 if not self.group.breakables:
467 467 self.pretty.group_queue.remove(self.group)
468 468 stream.write(self.obj)
469 469 return output_width + self.width
470 470
471 471
472 472 class Group(Printable):
473 473
474 474 def __init__(self, depth):
475 475 self.depth = depth
476 476 self.breakables = deque()
477 477 self.want_break = False
478 478
479 479
480 480 class GroupQueue(object):
481 481
482 482 def __init__(self, *groups):
483 483 self.queue = []
484 484 for group in groups:
485 485 self.enq(group)
486 486
487 487 def enq(self, group):
488 488 depth = group.depth
489 489 while depth > len(self.queue) - 1:
490 490 self.queue.append([])
491 491 self.queue[depth].append(group)
492 492
493 493 def deq(self):
494 494 for stack in self.queue:
495 495 for idx, group in enumerate(reversed(stack)):
496 496 if group.breakables:
497 497 del stack[idx]
498 498 group.want_break = True
499 499 return group
500 500 for group in stack:
501 501 group.want_break = True
502 502 del stack[:]
503 503
504 504 def remove(self, group):
505 505 try:
506 506 self.queue[group.depth].remove(group)
507 507 except ValueError:
508 508 pass
509 509
510 510
511 511 def _default_pprint(obj, p, cycle):
512 512 """
513 513 The default print function. Used if an object does not provide one and
514 514 it's none of the builtin objects.
515 515 """
516 516 klass = _safe_getattr(obj, '__class__', None) or type(obj)
517 517 if _safe_getattr(klass, '__repr__', None) is not object.__repr__:
518 518 # A user-provided repr. Find newlines and replace them with p.break_()
519 519 _repr_pprint(obj, p, cycle)
520 520 return
521 521 p.begin_group(1, '<')
522 522 p.pretty(klass)
523 523 p.text(' at 0x%x' % id(obj))
524 524 if cycle:
525 525 p.text(' ...')
526 526 elif p.verbose:
527 527 first = True
528 528 for key in dir(obj):
529 529 if not key.startswith('_'):
530 530 try:
531 531 value = getattr(obj, key)
532 532 except AttributeError:
533 533 continue
534 534 if isinstance(value, types.MethodType):
535 535 continue
536 536 if not first:
537 537 p.text(',')
538 538 p.breakable()
539 539 p.text(key)
540 540 p.text('=')
541 541 step = len(key) + 1
542 542 p.indentation += step
543 543 p.pretty(value)
544 544 p.indentation -= step
545 545 first = False
546 546 p.end_group(1, '>')
547 547
548 548
549 549 def _seq_pprinter_factory(start, end):
550 550 """
551 551 Factory that returns a pprint function useful for sequences. Used by
552 552 the default pprint for tuples, dicts, and lists.
553 553 """
554 554 def inner(obj, p, cycle):
555 555 if cycle:
556 556 return p.text(start + '...' + end)
557 557 step = len(start)
558 558 p.begin_group(step, start)
559 559 for idx, x in p._enumerate(obj):
560 560 if idx:
561 561 p.text(',')
562 562 p.breakable()
563 563 p.pretty(x)
564 564 if len(obj) == 1 and type(obj) is tuple:
565 565 # Special case for 1-item tuples.
566 566 p.text(',')
567 567 p.end_group(step, end)
568 568 return inner
569 569
570 570
571 571 def _set_pprinter_factory(start, end):
572 572 """
573 573 Factory that returns a pprint function useful for sets and frozensets.
574 574 """
575 575 def inner(obj, p, cycle):
576 576 if cycle:
577 577 return p.text(start + '...' + end)
578 578 if len(obj) == 0:
579 579 # Special case.
580 580 p.text(type(obj).__name__ + '()')
581 581 else:
582 582 step = len(start)
583 583 p.begin_group(step, start)
584 584 # Like dictionary keys, we will try to sort the items if there aren't too many
585 585 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
586 586 items = _sorted_for_pprint(obj)
587 587 else:
588 588 items = obj
589 589 for idx, x in p._enumerate(items):
590 590 if idx:
591 591 p.text(',')
592 592 p.breakable()
593 593 p.pretty(x)
594 594 p.end_group(step, end)
595 595 return inner
596 596
597 597
598 598 def _dict_pprinter_factory(start, end):
599 599 """
600 600 Factory that returns a pprint function used by the default pprint of
601 601 dicts and dict proxies.
602 602 """
603 603 def inner(obj, p, cycle):
604 604 if cycle:
605 605 return p.text('{...}')
606 606 step = len(start)
607 607 p.begin_group(step, start)
608 608 keys = obj.keys()
609 609 # if dict isn't large enough to be truncated, sort keys before displaying
610 610 # From Python 3.7, dicts preserve order by definition, so we don't sort.
611 611 if not DICT_IS_ORDERED \
612 612 and not (p.max_seq_length and len(obj) >= p.max_seq_length):
613 613 keys = _sorted_for_pprint(keys)
614 614 for idx, key in p._enumerate(keys):
615 615 if idx:
616 616 p.text(',')
617 617 p.breakable()
618 618 p.pretty(key)
619 619 p.text(': ')
620 620 p.pretty(obj[key])
621 621 p.end_group(step, end)
622 622 return inner
623 623
624 624
625 625 def _super_pprint(obj, p, cycle):
626 626 """The pprint for the super type."""
627 627 p.begin_group(8, '<super: ')
628 628 p.pretty(obj.__thisclass__)
629 629 p.text(',')
630 630 p.breakable()
631 631 if PYPY: # In PyPy, super() objects don't have __self__ attributes
632 632 dself = obj.__repr__.__self__
633 633 p.pretty(None if dself is obj else dself)
634 634 else:
635 635 p.pretty(obj.__self__)
636 636 p.end_group(8, '>')
637 637
638 638
639 639 def _re_pattern_pprint(obj, p, cycle):
640 640 """The pprint function for regular expression patterns."""
641 641 p.text('re.compile(')
642 642 pattern = repr(obj.pattern)
643 643 if pattern[:1] in 'uU':
644 644 pattern = pattern[1:]
645 645 prefix = 'ur'
646 646 else:
647 647 prefix = 'r'
648 648 pattern = prefix + pattern.replace('\\\\', '\\')
649 649 p.text(pattern)
650 650 if obj.flags:
651 651 p.text(',')
652 652 p.breakable()
653 653 done_one = False
654 654 for flag in ('TEMPLATE', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL',
655 655 'UNICODE', 'VERBOSE', 'DEBUG'):
656 656 if obj.flags & getattr(re, flag):
657 657 if done_one:
658 658 p.text('|')
659 659 p.text('re.' + flag)
660 660 done_one = True
661 661 p.text(')')
662 662
663 663
664 664 def _type_pprint(obj, p, cycle):
665 665 """The pprint for classes and types."""
666 666 # Heap allocated types might not have the module attribute,
667 667 # and others may set it to None.
668 668
669 669 # Checks for a __repr__ override in the metaclass. Can't compare the
670 670 # type(obj).__repr__ directly because in PyPy the representation function
671 671 # inherited from type isn't the same type.__repr__
672 672 if [m for m in _get_mro(type(obj)) if "__repr__" in vars(m)][:1] != [type]:
673 673 _repr_pprint(obj, p, cycle)
674 674 return
675 675
676 676 mod = _safe_getattr(obj, '__module__', None)
677 677 try:
678 678 name = obj.__qualname__
679 679 if not isinstance(name, str):
680 680 # This can happen if the type implements __qualname__ as a property
681 681 # or other descriptor in Python 2.
682 682 raise Exception("Try __name__")
683 683 except Exception:
684 684 name = obj.__name__
685 685 if not isinstance(name, str):
686 686 name = '<unknown type>'
687 687
688 688 if mod in (None, '__builtin__', 'builtins', 'exceptions'):
689 689 p.text(name)
690 690 else:
691 691 p.text(mod + '.' + name)
692 692
693 693
694 694 def _repr_pprint(obj, p, cycle):
695 695 """A pprint that just redirects to the normal repr function."""
696 696 # Find newlines and replace them with p.break_()
697 697 output = repr(obj)
698 698 for idx,output_line in enumerate(output.splitlines()):
699 699 if idx:
700 700 p.break_()
701 701 p.text(output_line)
702 702
703 703
704 704 def _function_pprint(obj, p, cycle):
705 705 """Base pprint for all functions and builtin functions."""
706 706 name = _safe_getattr(obj, '__qualname__', obj.__name__)
707 707 mod = obj.__module__
708 708 if mod and mod not in ('__builtin__', 'builtins', 'exceptions'):
709 709 name = mod + '.' + name
710 710 try:
711 711 func_def = name + str(signature(obj))
712 712 except ValueError:
713 713 func_def = name
714 714 p.text('<function %s>' % func_def)
715 715
716 716
717 717 def _exception_pprint(obj, p, cycle):
718 718 """Base pprint for all exceptions."""
719 719 name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__)
720 720 if obj.__class__.__module__ not in ('exceptions', 'builtins'):
721 721 name = '%s.%s' % (obj.__class__.__module__, name)
722 722 step = len(name) + 1
723 723 p.begin_group(step, name + '(')
724 724 for idx, arg in enumerate(getattr(obj, 'args', ())):
725 725 if idx:
726 726 p.text(',')
727 727 p.breakable()
728 728 p.pretty(arg)
729 729 p.end_group(step, ')')
730 730
731 731
732 732 #: the exception base
733 733 try:
734 734 _exception_base = BaseException
735 735 except NameError:
736 736 _exception_base = Exception
737 737
738 738
739 739 #: printers for builtin types
740 740 _type_pprinters = {
741 741 int: _repr_pprint,
742 742 float: _repr_pprint,
743 743 str: _repr_pprint,
744 744 tuple: _seq_pprinter_factory('(', ')'),
745 745 list: _seq_pprinter_factory('[', ']'),
746 746 dict: _dict_pprinter_factory('{', '}'),
747 747 set: _set_pprinter_factory('{', '}'),
748 748 frozenset: _set_pprinter_factory('frozenset({', '})'),
749 749 super: _super_pprint,
750 750 _re_pattern_type: _re_pattern_pprint,
751 751 type: _type_pprint,
752 752 types.FunctionType: _function_pprint,
753 753 types.BuiltinFunctionType: _function_pprint,
754 754 types.MethodType: _repr_pprint,
755 755 datetime.datetime: _repr_pprint,
756 756 datetime.timedelta: _repr_pprint,
757 757 _exception_base: _exception_pprint
758 758 }
759 759
760 760 # render os.environ like a dict
761 761 _env_type = type(os.environ)
762 762 # future-proof in case os.environ becomes a plain dict?
763 763 if _env_type is not dict:
764 764 _type_pprinters[_env_type] = _dict_pprinter_factory('environ{', '}')
765 765
766 766 try:
767 767 # In PyPy, types.DictProxyType is dict, setting the dictproxy printer
768 768 # using dict.setdefault avoids overwriting the dict printer
769 769 _type_pprinters.setdefault(types.DictProxyType,
770 770 _dict_pprinter_factory('dict_proxy({', '})'))
771 771 _type_pprinters[types.ClassType] = _type_pprint
772 772 _type_pprinters[types.SliceType] = _repr_pprint
773 773 except AttributeError: # Python 3
774 774 _type_pprinters[types.MappingProxyType] = \
775 775 _dict_pprinter_factory('mappingproxy({', '})')
776 776 _type_pprinters[slice] = _repr_pprint
777 777
778 778 try:
779 779 _type_pprinters[long] = _repr_pprint
780 780 _type_pprinters[unicode] = _repr_pprint
781 781 except NameError:
782 782 _type_pprinters[range] = _repr_pprint
783 783 _type_pprinters[bytes] = _repr_pprint
784 784
785 785 #: printers for types specified by name
786 786 _deferred_type_pprinters = {
787 787 }
788 788
789 789 def for_type(typ, func):
790 790 """
791 791 Add a pretty printer for a given type.
792 792 """
793 793 oldfunc = _type_pprinters.get(typ, None)
794 794 if func is not None:
795 795 # To support easy restoration of old pprinters, we need to ignore Nones.
796 796 _type_pprinters[typ] = func
797 797 return oldfunc
798 798
799 799 def for_type_by_name(type_module, type_name, func):
800 800 """
801 801 Add a pretty printer for a type specified by the module and name of a type
802 802 rather than the type object itself.
803 803 """
804 804 key = (type_module, type_name)
805 805 oldfunc = _deferred_type_pprinters.get(key, None)
806 806 if func is not None:
807 807 # To support easy restoration of old pprinters, we need to ignore Nones.
808 808 _deferred_type_pprinters[key] = func
809 809 return oldfunc
810 810
811 811
812 812 #: printers for the default singletons
813 813 _singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis,
814 814 NotImplemented]), _repr_pprint)
815 815
816 816
817 817 def _defaultdict_pprint(obj, p, cycle):
818 818 name = obj.__class__.__name__
819 819 with p.group(len(name) + 1, name + '(', ')'):
820 820 if cycle:
821 821 p.text('...')
822 822 else:
823 823 p.pretty(obj.default_factory)
824 824 p.text(',')
825 825 p.breakable()
826 826 p.pretty(dict(obj))
827 827
828 828 def _ordereddict_pprint(obj, p, cycle):
829 829 name = obj.__class__.__name__
830 830 with p.group(len(name) + 1, name + '(', ')'):
831 831 if cycle:
832 832 p.text('...')
833 833 elif len(obj):
834 834 p.pretty(list(obj.items()))
835 835
836 836 def _deque_pprint(obj, p, cycle):
837 837 name = obj.__class__.__name__
838 838 with p.group(len(name) + 1, name + '(', ')'):
839 839 if cycle:
840 840 p.text('...')
841 841 else:
842 842 p.pretty(list(obj))
843 843
844 844
845 845 def _counter_pprint(obj, p, cycle):
846 846 name = obj.__class__.__name__
847 847 with p.group(len(name) + 1, name + '(', ')'):
848 848 if cycle:
849 849 p.text('...')
850 850 elif len(obj):
851 851 p.pretty(dict(obj))
852 852
853 853 for_type_by_name('collections', 'defaultdict', _defaultdict_pprint)
854 854 for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint)
855 855 for_type_by_name('collections', 'deque', _deque_pprint)
856 856 for_type_by_name('collections', 'Counter', _counter_pprint)
857 857
858 858 if __name__ == '__main__':
859 859 from random import randrange
860 860 class Foo(object):
861 861 def __init__(self):
862 862 self.foo = 1
863 863 self.bar = re.compile(r'\s+')
864 864 self.blub = dict.fromkeys(range(30), randrange(1, 40))
865 865 self.hehe = 23424.234234
866 866 self.list = ["blub", "blah", self]
867 867
868 868 def get_foo(self):
869 869 print("foo")
870 870
871 871 pprint(Foo(), verbose=True)
@@ -1,46 +1,46 b''
1 1 """Some simple tests for the plugin while running scripts.
2 2 """
3 3 # Module imports
4 4 # Std lib
5 5 import inspect
6 6
7 7 # Our own
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Testing functions
11 11
12 12 def test_trivial():
13 13 """A trivial passing test."""
14 14 pass
15 15
16 16 def doctest_run():
17 17 """Test running a trivial script.
18 18
19 19 In [13]: run simplevars.py
20 20 x is: 1
21 21 """
22
22
23 23 def doctest_runvars():
24 24 """Test that variables defined in scripts get loaded correclty via %run.
25 25
26 26 In [13]: run simplevars.py
27 27 x is: 1
28 28
29 29 In [14]: x
30 30 Out[14]: 1
31 31 """
32 32
33 33 def doctest_ivars():
34 34 """Test that variables defined interactively are picked up.
35 35 In [5]: zz=1
36 36
37 37 In [6]: zz
38 38 Out[6]: 1
39 39 """
40 40
41 41 def doctest_refs():
42 42 """DocTest reference holding issues when running scripts.
43 43
44 44 In [32]: run show_refs.py
45 45 c referrers: [<... 'dict'>]
46 46 """
@@ -1,96 +1,95 b''
1 1 # encoding: utf-8
2 2 """
3 3 Utilities for working with stack frames.
4 4 """
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2008-2011 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 import sys
18 18 from IPython.utils import py3compat
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Code
22 22 #-----------------------------------------------------------------------------
23 23
24 24 def extract_vars(*names,**kw):
25 25 """Extract a set of variables by name from another frame.
26 26
27 27 Parameters
28 28 ----------
29 29 *names : str
30 30 One or more variable names which will be extracted from the caller's
31 31 frame.
32 32
33 33 depth : integer, optional
34 34 How many frames in the stack to walk when looking for your variables.
35 35 The default is 0, which will use the frame where the call was made.
36 36
37 37
38 38 Examples
39 39 --------
40 40 ::
41 41
42 42 In [2]: def func(x):
43 43 ...: y = 1
44 44 ...: print(sorted(extract_vars('x','y').items()))
45 45 ...:
46 46
47 47 In [3]: func('hello')
48 48 [('x', 'hello'), ('y', 1)]
49 49 """
50 50
51 51 depth = kw.get('depth',0)
52
52
53 53 callerNS = sys._getframe(depth+1).f_locals
54 54 return dict((k,callerNS[k]) for k in names)
55 55
56 56
57 57 def extract_vars_above(*names):
58 58 """Extract a set of variables by name from another frame.
59 59
60 60 Similar to extractVars(), but with a specified depth of 1, so that names
61 are exctracted exactly from above the caller.
61 are extracted exactly from above the caller.
62 62
63 63 This is simply a convenience function so that the very common case (for us)
64 64 of skipping exactly 1 frame doesn't have to construct a special dict for
65 65 keyword passing."""
66 66
67 67 callerNS = sys._getframe(2).f_locals
68 68 return dict((k,callerNS[k]) for k in names)
69 69
70 70
71 71 def debugx(expr,pre_msg=''):
72 72 """Print the value of an expression from the caller's frame.
73 73
74 74 Takes an expression, evaluates it in the caller's frame and prints both
75 75 the given expression and the resulting value (as well as a debug mark
76 76 indicating the name of the calling function. The input must be of a form
77 77 suitable for eval().
78 78
79 79 An optional message can be passed, which will be prepended to the printed
80 80 expr->value pair."""
81 81
82 82 cf = sys._getframe(1)
83 83 print('[DBG:%s] %s%s -> %r' % (cf.f_code.co_name,pre_msg,expr,
84 84 eval(expr,cf.f_globals,cf.f_locals)))
85 85
86 86
87 87 # deactivate it by uncommenting the following line, which makes it a no-op
88 88 #def debugx(expr,pre_msg=''): pass
89 89
90 90 def extract_module_locals(depth=0):
91 91 """Returns (module, locals) of the function `depth` frames away from the caller"""
92 92 f = sys._getframe(depth + 1)
93 93 global_ns = f.f_globals
94 94 module = sys.modules[global_ns['__name__']]
95 95 return (module, f.f_locals)
96
General Comments 0
You need to be logged in to leave comments. Login now