1 """Get useful information from live Python objects.
3 This module encapsulates the interface provided by the internal special
4 attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion.
5 It also provides some help for examining source code and class layout.
7 Here are some of the useful functions provided by this module:
9 ismodule(), isclass(), ismethod(), isfunction(), istraceback(),
10 isframe(), iscode(), isbuiltin(), isroutine() - check object types
11 getmembers() - get members of an object that satisfy a given condition
13 getfile(), getsourcefile(), getsource() - find an object's source code
14 getdoc(), getcomments() - get documentation on an object
15 getmodule() - determine the module that an object came from
16 getclasstree() - arrange classes so as to represent their hierarchy
18 getargspec(), getargvalues() - get info about function arguments
19 formatargspec(), formatargvalues() - format an argument spec
20 getouterframes(), getinnerframes() - get info about frames
21 currentframe() - get the current stack frame
22 stack(), trace() - get info about frames on the stack or in a traceback
27 __author__ =
'Ka-Ping Yee <ping@lfw.org>'
28 __date__ =
'1 Jan 2001'
30 import sys, os, types, string, re, dis, imp, tokenize
34 """Return true if the object is a module.
36 Module objects provide these attributes:
37 __doc__ documentation string
38 __file__ filename (missing for built-in modules)"""
39 return isinstance(object, types.ModuleType)
42 """Return true if the object is a class.
44 Class objects provide these attributes:
45 __doc__ documentation string
46 __module__ name of module in which this class was defined"""
47 return isinstance(object, types.ClassType)
or hasattr(object,
'__bases__')
50 """Return true if the object is an instance method.
52 Instance method objects provide these attributes:
53 __doc__ documentation string
54 __name__ name with which this method was defined
55 im_class class object in which this method belongs
56 im_func function object containing implementation of method
57 im_self instance to which this method is bound, or None"""
58 return isinstance(object, types.MethodType)
61 """Return true if the object is a method descriptor.
63 But not if ismethod() or isclass() or isfunction() are true.
65 This is new in Python 2.2, and, for example, is true of int.__add__.
66 An object passing this test has a __get__ attribute but not a __set__
67 attribute, but beyond that the set of attributes varies. __name__ is
68 usually sensible, and __doc__ often is.
70 Methods implemented via descriptors that also pass one of the other
71 tests return false from the ismethoddescriptor() test, simply because
72 the other tests promise more -- you can, e.g., count on having the
73 im_func attribute (etc) when an object passes ismethod()."""
74 return (hasattr(object,
"__get__")
75 and not hasattr(object,
"__set__")
81 """Return true if the object is a user-defined function.
83 Function objects provide these attributes:
84 __doc__ documentation string
85 __name__ name with which this function was defined
86 func_code code object containing compiled function bytecode
87 func_defaults tuple of any default values for arguments
88 func_doc (same as __doc__)
89 func_globals global namespace in which this function was defined
90 func_name (same as __name__)"""
91 return isinstance(object, types.FunctionType)
94 """Return true if the object is a traceback.
96 Traceback objects provide these attributes:
97 tb_frame frame object at this level
98 tb_lasti index of last attempted instruction in bytecode
99 tb_lineno current line number in Python source code
100 tb_next next inner traceback object (called by this level)"""
101 return isinstance(object, types.TracebackType)
104 """Return true if the object is a frame object.
106 Frame objects provide these attributes:
107 f_back next outer frame object (this frame's caller)
108 f_builtins built-in namespace seen by this frame
109 f_code code object being executed in this frame
110 f_exc_traceback traceback if raised in this frame, or None
111 f_exc_type exception type if raised in this frame, or None
112 f_exc_value exception value if raised in this frame, or None
113 f_globals global namespace seen by this frame
114 f_lasti index of last attempted instruction in bytecode
115 f_lineno current line number in Python source code
116 f_locals local namespace seen by this frame
117 f_restricted 0 or 1 if frame is in restricted execution mode
118 f_trace tracing function for this frame, or None"""
119 return isinstance(object, types.FrameType)
122 """Return true if the object is a code object.
124 Code objects provide these attributes:
125 co_argcount number of arguments (not including * or ** args)
126 co_code string of raw compiled bytecode
127 co_consts tuple of constants used in the bytecode
128 co_filename name of file in which this code object was created
129 co_firstlineno number of first line in Python source code
130 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
131 co_lnotab encoded mapping of line numbers to bytecode indices
132 co_name name with which this code object was defined
133 co_names tuple of names of local variables
134 co_nlocals number of local variables
135 co_stacksize virtual machine stack space required
136 co_varnames tuple of names of arguments and local variables"""
137 return isinstance(object, types.CodeType)
140 """Return true if the object is a built-in function or method.
142 Built-in functions and methods provide these attributes:
143 __doc__ documentation string
144 __name__ original name of this function or method
145 __self__ instance to which a method is bound, or None"""
146 return isinstance(object, types.BuiltinFunctionType)
149 """Return true if the object is any kind of function or method."""
156 """Return all members of an object as (name, value) pairs sorted by name.
157 Optionally, only return members that satisfy a given predicate."""
159 for key
in dir(object):
160 value = getattr(object, key)
161 if not predicate
or predicate(value):
162 results.append((key, value))
167 """Return list of attribute-descriptor tuples.
169 For each name in dir(cls), the return list contains a 4-tuple
172 0. The name (a string).
174 1. The kind of attribute this is, one of these strings:
175 'class method' created via classmethod()
176 'static method' created via staticmethod()
177 'property' created via property()
178 'method' any other flavor of method
181 2. The class which defined this attribute (a class).
183 3. The object as obtained directly from the defining class's
184 __dict__, not via getattr. This is especially important for
185 data attributes: C.data is just a data object, but
186 C.__dict__['data'] may be a data descriptor with additional
187 info, like a __doc__ string.
197 if name
in cls.__dict__:
198 obj = cls.__dict__[name]
200 obj = getattr(cls, name)
203 homecls = getattr(obj,
"__objclass__",
None)
207 if name
in base.__dict__:
213 if homecls
is not None and name
in homecls.__dict__:
214 obj = homecls.__dict__[name]
217 obj_via_getattr = getattr(cls, name)
220 if isinstance(obj, staticmethod):
221 kind =
"static method"
222 elif isinstance(obj, classmethod):
223 kind =
"class method"
224 elif isinstance(obj, property):
232 result.append((name, kind, homecls, obj))
237 def _searchbases(cls, accum):
242 for base
in cls.__bases__:
243 _searchbases(base, accum)
246 "Return tuple of base classes (including cls) in method resolution order."
247 if hasattr(cls,
"__mro__"):
251 _searchbases(cls, result)
256 """Return the indent size, in spaces, at the start of a line of text."""
261 """Get the documentation string for an object.
263 All tabs are expanded to spaces. To clean up docstrings that are
264 indented to line up with blocks of code, any whitespace than can be
265 uniformly removed from the second line onwards is removed."""
268 except AttributeError:
270 if not isinstance(doc, (str, unicode)):
278 for line
in lines[1:]:
280 if not content:
continue
281 indent = len(line) - content
282 if margin
is None: margin = indent
283 else: margin =
min(margin, indent)
284 if margin
is not None:
285 for i
in range(1, len(lines)): lines[i] = lines[i][margin:]
289 """Work out which source or compiled file an object was defined in."""
291 if hasattr(object,
'__file__'):
292 return object.__file__
293 raise TypeError,
'arg is a built-in module'
295 object = sys.modules.get(object.__module__)
296 if hasattr(object,
'__file__'):
297 return object.__file__
298 raise TypeError,
'arg is a built-in class'
300 object = object.im_func
302 object = object.func_code
304 object = object.tb_frame
306 object = object.f_code
308 return object.co_filename
309 raise TypeError,
'arg is not a module, class, method, ' \
310 'function, traceback, frame, or code object'
313 """Get the module name, suffix, mode, and module type for a given file."""
314 filename = os.path.basename(path)
315 suffixes = map(
lambda (suffix, mode, mtype):
316 (-len(suffix), suffix, mode, mtype), imp.get_suffixes())
318 for neglen, suffix, mode, mtype
in suffixes:
319 if filename[neglen:] == suffix:
320 return filename[:neglen], suffix, mode, mtype
323 """Return the module name for a given file, or None."""
325 if info:
return info[0]
328 """Return the Python source file an object was defined in, if it exists."""
331 filename = filename[:-4] +
'.py'
332 for suffix, mode, kind
in imp.get_suffixes():
333 if 'b' in mode
and string.lower(filename[-len(suffix):]) == suffix:
336 if os.path.exists(filename):
340 """Return an absolute path to the source or compiled file for an object.
342 The idea is for each object to have a unique origin, so this routine
343 normalizes the result as much as possible."""
344 return os.path.normcase(
350 """Return the module an object was defined in, or None if not found."""
354 return sys.modules.get(object.__module__)
359 if modulesbyfile.has_key(file):
360 return sys.modules[modulesbyfile[file]]
361 for module
in sys.modules.values():
362 if hasattr(module,
'__file__'):
363 modulesbyfile[
getabsfile(module)] = module.__name__
364 if modulesbyfile.has_key(file):
365 return sys.modules[modulesbyfile[file]]
366 main = sys.modules[
'__main__']
367 if hasattr(main, object.__name__):
368 mainobject = getattr(main, object.__name__)
369 if mainobject
is object:
371 builtin = sys.modules[
'__builtin__']
372 if hasattr(builtin, object.__name__):
373 builtinobject = getattr(builtin, object.__name__)
374 if builtinobject
is object:
378 """Return the entire source file and starting line number for an object.
380 The argument may be a module, class, method, function, traceback, frame,
381 or code object. The source code is returned as a list of all the lines
382 in the file and the line number indexes a line in that list. An IOError
383 is raised if the source code cannot be retrieved."""
386 except (TypeError, IOError):
387 raise IOError,
'could not get source code'
388 lines = file.readlines()
395 name = object.__name__
396 pat = re.compile(
r'^\s*class\s*' + name +
r'\b')
397 for i
in range(len(lines)):
398 if pat.match(lines[i]):
return lines, i
399 else:
raise IOError,
'could not find class definition'
402 object = object.im_func
404 object = object.func_code
406 object = object.tb_frame
408 object = object.f_code
410 if not hasattr(object,
'co_firstlineno'):
411 raise IOError,
'could not find function definition'
412 lnum = object.co_firstlineno - 1
413 pat = re.compile(
r'^\s*def\s')
415 if pat.match(lines[lnum]):
break
418 raise IOError,
'could not find code object'
421 """Get lines of comments immediately preceding an object's source code."""
423 except IOError:
return None
428 if lines
and lines[0][:2] ==
'#!': start = 1
429 while start < len(lines)
and string.strip(lines[start])
in [
'',
'#']:
431 if start < len(lines)
and lines[start][:1] ==
'#':
434 while end < len(lines)
and lines[end][:1] ==
'#':
449 while comment[:1] ==
'#' and indentsize(lines[end]) == indent:
450 comments[:0] = [comment]
461 """Provide a readline() method to return lines from a list of strings."""
468 if i < len(self.
lines):
476 """Provide a tokeneater() method to detect the end of a code block."""
482 def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
484 if type == tokenize.NAME: self.
started = 1
485 elif type == tokenize.NEWLINE:
487 elif type == tokenize.INDENT:
489 elif type == tokenize.DEDENT:
491 if self.
indent == 0:
raise EndOfBlock, self.
last
494 """Extract the block of code at the top of the given list of lines."""
497 except EndOfBlock, eob:
498 return lines[:eob.args[0]]
501 """Return a list of source lines and starting line number for an object.
503 The argument may be a module, class, method, function, traceback, frame,
504 or code object. The source code is returned as a list of the lines
505 corresponding to the object and the line number indicates where in the
506 original source file the first line of code was found. An IOError is
507 raised if the source code cannot be retrieved."""
510 if ismodule(object):
return lines, 0
511 else:
return getblock(lines[lnum:]), lnum + 1
514 """Return the text of the source code for an object.
516 The argument may be a module, class, method, function, traceback, frame,
517 or code object. The source code is returned as a single string. An
518 IOError is raised if the source code cannot be retrieved."""
524 """Recursive helper function for getclasstree()."""
526 classes.sort(
lambda a, b:
cmp(a.__name__, b.__name__))
528 results.append((c, c.__bases__))
529 if children.has_key(c):
530 results.append(
walktree(children[c], children, c))
534 """Arrange the given list of classes into a hierarchy of nested lists.
536 Where a nested list appears, it contains classes derived from the class
537 whose entry immediately precedes the list. Each entry is a 2-tuple
538 containing a class and a tuple of its base classes. If the 'unique'
539 argument is true, exactly one entry appears in the returned structure
540 for each class in the given list. Otherwise, classes using multiple
541 inheritance and their descendants will appear multiple times."""
546 for parent
in c.__bases__:
547 if not children.has_key(parent):
548 children[parent] = []
549 children[parent].
append(c)
550 if unique
and parent
in classes:
break
553 for parent
in children.keys():
554 if parent
not in classes:
556 return walktree(roots, children,
None)
560 CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8
563 """Get information about the arguments accepted by a code object.
565 Three things are returned: (args, varargs, varkw), where 'args' is
566 a list of argument names (possibly containing nested lists), and
567 'varargs' and 'varkw' are the names of the * and ** arguments or None."""
568 if not iscode(co):
raise TypeError,
'arg is not a code object'
571 nargs = co.co_argcount
572 names = co.co_varnames
573 args = list(names[:nargs])
577 for i
in range(nargs):
578 if args[i][:1]
in [
'',
'.']:
579 stack, remain, count = [], [], []
580 while step < len(code):
583 if op >= dis.HAVE_ARGUMENT:
584 opname = dis.opname[op]
585 value = ord(code[step]) + ord(code[step+1])*256
587 if opname
in [
'UNPACK_TUPLE',
'UNPACK_SEQUENCE']:
590 elif opname ==
'STORE_FAST':
591 stack.append(names[value])
592 remain[-1] = remain[-1] - 1
593 while remain[-1] == 0:
596 stack[-size:] = [stack[-size:]]
598 remain[-1] = remain[-1] - 1
603 if co.co_flags & CO_VARARGS:
604 varargs = co.co_varnames[nargs]
607 if co.co_flags & CO_VARKEYWORDS:
608 varkw = co.co_varnames[nargs]
609 return args, varargs, varkw
612 """Get the names and default values of a function's arguments.
614 A tuple of four things is returned: (args, varargs, varkw, defaults).
615 'args' is a list of the argument names (it may contain nested lists).
616 'varargs' and 'varkw' are the names of the * and ** arguments or None.
617 'defaults' is an n-tuple of the default values of the last n arguments."""
618 if not isfunction(func):
raise TypeError,
'arg is not a Python function'
619 args, varargs, varkw =
getargs(func.func_code)
620 return args, varargs, varkw, func.func_defaults
623 """Get information about arguments passed into a particular frame.
625 A tuple of four things is returned: (args, varargs, varkw, locals).
626 'args' is a list of the argument names (it may contain nested lists).
627 'varargs' and 'varkw' are the names of the * and ** arguments or None.
628 'locals' is the locals dictionary of the given frame."""
629 args, varargs, varkw =
getargs(frame.f_code)
630 return args, varargs, varkw, frame.f_locals
634 return '(' + seq[0] +
',)'
638 def strseq(object, convert, join=joinseq):
639 """Recursively walk a sequence, stringifying each element."""
640 if type(object)
in [types.ListType, types.TupleType]:
641 return join(map(
lambda o, c=convert, j=join:
strseq(o, c, j), object))
645 def formatargspec(args, varargs=None, varkw=None, defaults=None,
647 formatvarargs=
lambda name:
'*' + name,
648 formatvarkw=
lambda name:
'**' + name,
649 formatvalue=
lambda value:
'=' +
repr(value),
651 """Format an argument spec from the 4 values returned by getargspec.
653 The first four arguments are (args, varargs, varkw, defaults). The
654 other four arguments are the corresponding optional formatting functions
655 that are called to turn names and values into strings. The ninth
656 argument is an optional function to format the sequence of arguments."""
659 firstdefault = len(args) - len(defaults)
660 for i
in range(len(args)):
661 spec =
strseq(args[i], formatarg, join)
662 if defaults
and i >= firstdefault:
663 spec = spec + formatvalue(defaults[i - firstdefault])
666 specs.append(formatvarargs(varargs))
668 specs.append(formatvarkw(varkw))
673 formatvarargs=
lambda name:
'*' + name,
674 formatvarkw=
lambda name:
'**' + name,
675 formatvalue=
lambda value:
'=' +
repr(value),
677 """Format an argument spec from the 4 values returned by getargvalues.
679 The first four arguments are (args, varargs, varkw, locals). The
680 next four arguments are the corresponding optional formatting functions
681 that are called to turn names and values into strings. The ninth
682 argument is an optional function to format the sequence of arguments."""
683 def convert(name, locals=locals,
684 formatarg=formatarg, formatvalue=formatvalue):
685 return formatarg(name) + formatvalue(locals[name])
687 for i
in range(len(args)):
688 specs.append(
strseq(args[i], convert, join))
690 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
692 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
697 """Get information about a frame or traceback object.
699 A tuple of five things is returned: the filename, the line number of
700 the current line, the function name, a list of lines of context from
701 the source code, and the index of the current line within that list.
702 The optional second argument specifies the number of lines of context
703 to return, which are centered around the current line."""
705 frame = frame.tb_frame
707 raise TypeError,
'arg is not a frame or traceback object'
712 start = lineno - 1 - context//2
718 start =
max(start, 1)
719 start =
min(start, len(lines) - context)
720 lines = lines[start:start+context]
721 index = lineno - 1 - start
725 return (filename, lineno, frame.f_code.co_name, lines, index)
728 """Get the line number from a frame object, allowing for optimization."""
730 lineno = frame.f_lineno
732 if hasattr(code,
'co_lnotab'):
733 table = code.co_lnotab
734 lineno = code.co_firstlineno
736 for i
in range(0, len(table), 2):
737 addr = addr + ord(table[i])
738 if addr > frame.f_lasti:
break
739 lineno = lineno + ord(table[i+1])
743 """Get a list of records for a frame and all higher (calling) frames.
745 Each record contains a frame object, filename, line number, function
746 name, a list of lines of context, and index within the context."""
749 framelist.append((frame,) +
getframeinfo(frame, context))
754 """Get a list of records for a traceback's frame and all lower frames.
756 Each record contains a frame object, filename, line number, function
757 name, a list of lines of context, and index within the context."""
760 framelist.append((tb.tb_frame,) +
getframeinfo(tb, context))
765 """Return the frame object for the caller's stack frame."""
769 return sys.exc_traceback.tb_frame.f_back
771 if hasattr(sys,
'_getframe'): currentframe = sys._getframe
774 """Return a list of records for the stack above the caller's frame."""
778 """Return a list of records for the stack below the current exception."""