blob: eca5e8ca78ef88cde32faa4bfeafab293096695d [file] [log] [blame]
Martin v. Löwis09776b72002-08-04 17:22:59 +00001# -*- coding: iso-8859-1 -*-
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00002"""Get useful information from live Python objects.
3
4This module encapsulates the interface provided by the internal special
5attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion.
6It also provides some help for examining source code and class layout.
7
8Here are some of the useful functions provided by this module:
9
10 ismodule(), isclass(), ismethod(), isfunction(), istraceback(),
11 isframe(), iscode(), isbuiltin(), isroutine() - check object types
12 getmembers() - get members of an object that satisfy a given condition
13
14 getfile(), getsourcefile(), getsource() - find an object's source code
15 getdoc(), getcomments() - get documentation on an object
16 getmodule() - determine the module that an object came from
17 getclasstree() - arrange classes so as to represent their hierarchy
18
19 getargspec(), getargvalues() - get info about function arguments
20 formatargspec(), formatargvalues() - format an argument spec
21 getouterframes(), getinnerframes() - get info about frames
22 currentframe() - get the current stack frame
23 stack(), trace() - get info about frames on the stack or in a traceback
24"""
25
26# This module is in the public domain. No warranties.
27
Ka-Ping Yee8b58b842001-03-01 13:56:16 +000028__author__ = 'Ka-Ping Yee <ping@lfw.org>'
29__date__ = '1 Jan 2001'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000030
Neil Schemenauerf06f8532002-03-23 23:51:04 +000031import sys, os, types, string, re, dis, imp, tokenize, linecache
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000032
33# ----------------------------------------------------------- type-checking
34def ismodule(object):
35 """Return true if the object is a module.
36
37 Module objects provide these attributes:
38 __doc__ documentation string
39 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000040 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000041
42def isclass(object):
43 """Return true if the object is a class.
44
45 Class objects provide these attributes:
46 __doc__ documentation string
47 __module__ name of module in which this class was defined"""
Tim Peters28bc59f2001-09-16 08:40:16 +000048 return isinstance(object, types.ClassType) or hasattr(object, '__bases__')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000049
50def ismethod(object):
51 """Return true if the object is an instance method.
52
53 Instance method objects provide these attributes:
54 __doc__ documentation string
55 __name__ name with which this method was defined
56 im_class class object in which this method belongs
57 im_func function object containing implementation of method
58 im_self instance to which this method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +000059 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000060
Tim Peters536d2262001-09-20 05:13:38 +000061def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000062 """Return true if the object is a method descriptor.
63
64 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000065
66 This is new in Python 2.2, and, for example, is true of int.__add__.
67 An object passing this test has a __get__ attribute but not a __set__
68 attribute, but beyond that the set of attributes varies. __name__ is
69 usually sensible, and __doc__ often is.
70
Tim Petersf1d90b92001-09-20 05:47:55 +000071 Methods implemented via descriptors that also pass one of the other
72 tests return false from the ismethoddescriptor() test, simply because
73 the other tests promise more -- you can, e.g., count on having the
74 im_func attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000075 return (hasattr(object, "__get__")
76 and not hasattr(object, "__set__") # else it's a data descriptor
77 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000078 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000079 and not isclass(object))
80
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000081def isdatadescriptor(object):
82 """Return true if the object is a data descriptor.
83
84 Data descriptors have both a __get__ and a __set__ attribute. Examples are
85 properties (defined in Python) and getsets and members (defined in C).
86 Typically, data descriptors will also have __name__ and __doc__ attributes
87 (properties, getsets, and members have both of these attributes), but this
88 is not guaranteed."""
89 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
90
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000091def isfunction(object):
92 """Return true if the object is a user-defined function.
93
94 Function objects provide these attributes:
95 __doc__ documentation string
96 __name__ name with which this function was defined
97 func_code code object containing compiled function bytecode
98 func_defaults tuple of any default values for arguments
99 func_doc (same as __doc__)
100 func_globals global namespace in which this function was defined
101 func_name (same as __name__)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000102 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000103
104def istraceback(object):
105 """Return true if the object is a traceback.
106
107 Traceback objects provide these attributes:
108 tb_frame frame object at this level
109 tb_lasti index of last attempted instruction in bytecode
110 tb_lineno current line number in Python source code
111 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000112 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000113
114def isframe(object):
115 """Return true if the object is a frame object.
116
117 Frame objects provide these attributes:
118 f_back next outer frame object (this frame's caller)
119 f_builtins built-in namespace seen by this frame
120 f_code code object being executed in this frame
121 f_exc_traceback traceback if raised in this frame, or None
122 f_exc_type exception type if raised in this frame, or None
123 f_exc_value exception value if raised in this frame, or None
124 f_globals global namespace seen by this frame
125 f_lasti index of last attempted instruction in bytecode
126 f_lineno current line number in Python source code
127 f_locals local namespace seen by this frame
128 f_restricted 0 or 1 if frame is in restricted execution mode
129 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000130 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000131
132def iscode(object):
133 """Return true if the object is a code object.
134
135 Code objects provide these attributes:
136 co_argcount number of arguments (not including * or ** args)
137 co_code string of raw compiled bytecode
138 co_consts tuple of constants used in the bytecode
139 co_filename name of file in which this code object was created
140 co_firstlineno number of first line in Python source code
141 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
142 co_lnotab encoded mapping of line numbers to bytecode indices
143 co_name name with which this code object was defined
144 co_names tuple of names of local variables
145 co_nlocals number of local variables
146 co_stacksize virtual machine stack space required
147 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000148 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000149
150def isbuiltin(object):
151 """Return true if the object is a built-in function or method.
152
153 Built-in functions and methods provide these attributes:
154 __doc__ documentation string
155 __name__ original name of this function or method
156 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000157 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000158
159def isroutine(object):
160 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000161 return (isbuiltin(object)
162 or isfunction(object)
163 or ismethod(object)
164 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000165
166def getmembers(object, predicate=None):
167 """Return all members of an object as (name, value) pairs sorted by name.
168 Optionally, only return members that satisfy a given predicate."""
169 results = []
170 for key in dir(object):
171 value = getattr(object, key)
172 if not predicate or predicate(value):
173 results.append((key, value))
174 results.sort()
175 return results
176
Tim Peters13b49d32001-09-23 02:00:29 +0000177def classify_class_attrs(cls):
178 """Return list of attribute-descriptor tuples.
179
180 For each name in dir(cls), the return list contains a 4-tuple
181 with these elements:
182
183 0. The name (a string).
184
185 1. The kind of attribute this is, one of these strings:
186 'class method' created via classmethod()
187 'static method' created via staticmethod()
188 'property' created via property()
189 'method' any other flavor of method
190 'data' not a method
191
192 2. The class which defined this attribute (a class).
193
194 3. The object as obtained directly from the defining class's
195 __dict__, not via getattr. This is especially important for
196 data attributes: C.data is just a data object, but
197 C.__dict__['data'] may be a data descriptor with additional
198 info, like a __doc__ string.
199 """
200
201 mro = getmro(cls)
202 names = dir(cls)
203 result = []
204 for name in names:
205 # Get the object associated with the name.
206 # Getting an obj from the __dict__ sometimes reveals more than
207 # using getattr. Static and class methods are dramatic examples.
208 if name in cls.__dict__:
209 obj = cls.__dict__[name]
210 else:
211 obj = getattr(cls, name)
212
213 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000214 homecls = getattr(obj, "__objclass__", None)
215 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000216 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000217 for base in mro:
218 if name in base.__dict__:
219 homecls = base
220 break
221
222 # Get the object again, in order to get it from the defining
223 # __dict__ instead of via getattr (if possible).
224 if homecls is not None and name in homecls.__dict__:
225 obj = homecls.__dict__[name]
226
227 # Also get the object via getattr.
228 obj_via_getattr = getattr(cls, name)
229
230 # Classify the object.
231 if isinstance(obj, staticmethod):
232 kind = "static method"
233 elif isinstance(obj, classmethod):
234 kind = "class method"
235 elif isinstance(obj, property):
236 kind = "property"
237 elif (ismethod(obj_via_getattr) or
238 ismethoddescriptor(obj_via_getattr)):
239 kind = "method"
240 else:
241 kind = "data"
242
243 result.append((name, kind, homecls, obj))
244
245 return result
246
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000247# ----------------------------------------------------------- class helpers
248def _searchbases(cls, accum):
249 # Simulate the "classic class" search order.
250 if cls in accum:
251 return
252 accum.append(cls)
253 for base in cls.__bases__:
254 _searchbases(base, accum)
255
256def getmro(cls):
257 "Return tuple of base classes (including cls) in method resolution order."
258 if hasattr(cls, "__mro__"):
259 return cls.__mro__
260 else:
261 result = []
262 _searchbases(cls, result)
263 return tuple(result)
264
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000265# -------------------------------------------------- source code extraction
266def indentsize(line):
267 """Return the indent size, in spaces, at the start of a line of text."""
268 expline = string.expandtabs(line)
269 return len(expline) - len(string.lstrip(expline))
270
271def getdoc(object):
272 """Get the documentation string for an object.
273
274 All tabs are expanded to spaces. To clean up docstrings that are
275 indented to line up with blocks of code, any whitespace than can be
276 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000277 try:
278 doc = object.__doc__
279 except AttributeError:
280 return None
Michael W. Hudson755f75e2002-05-20 17:29:46 +0000281 if not isinstance(doc, types.StringTypes):
Tim Peters24008312002-03-17 18:56:20 +0000282 return None
283 try:
284 lines = string.split(string.expandtabs(doc), '\n')
285 except UnicodeError:
286 return None
287 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000288 # Find minimum indentation of any non-blank lines after first line.
289 margin = sys.maxint
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000290 for line in lines[1:]:
291 content = len(string.lstrip(line))
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000292 if content:
293 indent = len(line) - content
294 margin = min(margin, indent)
295 # Remove indentation.
296 if lines:
297 lines[0] = lines[0].lstrip()
298 if margin < sys.maxint:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000299 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000300 # Remove any trailing or leading blank lines.
301 while lines and not lines[-1]:
302 lines.pop()
303 while lines and not lines[0]:
304 lines.pop(0)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000305 return string.join(lines, '\n')
306
307def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000308 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000309 if ismodule(object):
310 if hasattr(object, '__file__'):
311 return object.__file__
312 raise TypeError, 'arg is a built-in module'
313 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000314 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000315 if hasattr(object, '__file__'):
316 return object.__file__
317 raise TypeError, 'arg is a built-in class'
318 if ismethod(object):
319 object = object.im_func
320 if isfunction(object):
321 object = object.func_code
322 if istraceback(object):
323 object = object.tb_frame
324 if isframe(object):
325 object = object.f_code
326 if iscode(object):
327 return object.co_filename
328 raise TypeError, 'arg is not a module, class, method, ' \
329 'function, traceback, frame, or code object'
330
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000331def getmoduleinfo(path):
332 """Get the module name, suffix, mode, and module type for a given file."""
333 filename = os.path.basename(path)
334 suffixes = map(lambda (suffix, mode, mtype):
335 (-len(suffix), suffix, mode, mtype), imp.get_suffixes())
336 suffixes.sort() # try longest suffixes first, in case they overlap
337 for neglen, suffix, mode, mtype in suffixes:
338 if filename[neglen:] == suffix:
339 return filename[:neglen], suffix, mode, mtype
340
341def getmodulename(path):
342 """Return the module name for a given file, or None."""
343 info = getmoduleinfo(path)
344 if info: return info[0]
345
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000346def getsourcefile(object):
347 """Return the Python source file an object was defined in, if it exists."""
348 filename = getfile(object)
349 if string.lower(filename[-4:]) in ['.pyc', '.pyo']:
350 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000351 for suffix, mode, kind in imp.get_suffixes():
352 if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
353 # Looks like a binary file. We want to only return a text file.
354 return None
355 if os.path.exists(filename):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000356 return filename
357
358def getabsfile(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000359 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000360
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000361 The idea is for each object to have a unique origin, so this routine
362 normalizes the result as much as possible."""
363 return os.path.normcase(
364 os.path.abspath(getsourcefile(object) or getfile(object)))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000365
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000366modulesbyfile = {}
367
368def getmodule(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000369 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000370 if ismodule(object):
371 return object
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000372 if isclass(object):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000373 return sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000374 try:
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000375 file = getabsfile(object)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000376 except TypeError:
377 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000378 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000379 return sys.modules.get(modulesbyfile[file])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000380 for module in sys.modules.values():
381 if hasattr(module, '__file__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000382 modulesbyfile[getabsfile(module)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000383 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000384 return sys.modules.get(modulesbyfile[file])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000385 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000386 if not hasattr(object, '__name__'):
387 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000388 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000389 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000390 if mainobject is object:
391 return main
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000392 builtin = sys.modules['__builtin__']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000393 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000394 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000395 if builtinobject is object:
396 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000397
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000398def findsource(object):
399 """Return the entire source file and starting line number for an object.
400
401 The argument may be a module, class, method, function, traceback, frame,
402 or code object. The source code is returned as a list of all the lines
403 in the file and the line number indexes a line in that list. An IOError
404 is raised if the source code cannot be retrieved."""
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000405 file = getsourcefile(object) or getfile(object)
406 lines = linecache.getlines(file)
407 if not lines:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000408 raise IOError, 'could not get source code'
409
410 if ismodule(object):
411 return lines, 0
412
413 if isclass(object):
414 name = object.__name__
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000415 pat = re.compile(r'^\s*class\s*' + name + r'\b')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000416 for i in range(len(lines)):
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000417 if pat.match(lines[i]): return lines, i
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000418 else: raise IOError, 'could not find class definition'
419
420 if ismethod(object):
421 object = object.im_func
422 if isfunction(object):
423 object = object.func_code
424 if istraceback(object):
425 object = object.tb_frame
426 if isframe(object):
427 object = object.f_code
428 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000429 if not hasattr(object, 'co_firstlineno'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000430 raise IOError, 'could not find function definition'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000431 lnum = object.co_firstlineno - 1
Raymond Hettinger2d375f72003-01-14 02:19:36 +0000432 pat = re.compile(r'^(\s*def\s)|(.*\slambda(:|\s))')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000433 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000434 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000435 lnum = lnum - 1
436 return lines, lnum
Neal Norwitz8a11f5d2002-03-13 03:14:26 +0000437 raise IOError, 'could not find code object'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000438
439def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000440 """Get lines of comments immediately preceding an object's source code.
441
442 Returns None when source can't be found.
443 """
444 try:
445 lines, lnum = findsource(object)
446 except (IOError, TypeError):
447 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000448
449 if ismodule(object):
450 # Look for a comment block at the top of the file.
451 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000452 if lines and lines[0][:2] == '#!': start = 1
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000453 while start < len(lines) and string.strip(lines[start]) in ['', '#']:
454 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000455 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000456 comments = []
457 end = start
458 while end < len(lines) and lines[end][:1] == '#':
459 comments.append(string.expandtabs(lines[end]))
460 end = end + 1
461 return string.join(comments, '')
462
463 # Look for a preceding block of comments at the same indentation.
464 elif lnum > 0:
465 indent = indentsize(lines[lnum])
466 end = lnum - 1
467 if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
468 indentsize(lines[end]) == indent:
469 comments = [string.lstrip(string.expandtabs(lines[end]))]
470 if end > 0:
471 end = end - 1
472 comment = string.lstrip(string.expandtabs(lines[end]))
473 while comment[:1] == '#' and indentsize(lines[end]) == indent:
474 comments[:0] = [comment]
475 end = end - 1
476 if end < 0: break
477 comment = string.lstrip(string.expandtabs(lines[end]))
478 while comments and string.strip(comments[0]) == '#':
479 comments[:1] = []
480 while comments and string.strip(comments[-1]) == '#':
481 comments[-1:] = []
482 return string.join(comments, '')
483
484class ListReader:
485 """Provide a readline() method to return lines from a list of strings."""
486 def __init__(self, lines):
487 self.lines = lines
488 self.index = 0
489
490 def readline(self):
491 i = self.index
492 if i < len(self.lines):
493 self.index = i + 1
494 return self.lines[i]
495 else: return ''
496
Tim Peters4efb6e92001-06-29 23:51:08 +0000497class EndOfBlock(Exception): pass
498
499class BlockFinder:
500 """Provide a tokeneater() method to detect the end of a code block."""
501 def __init__(self):
502 self.indent = 0
503 self.started = 0
504 self.last = 0
505
506 def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
507 if not self.started:
508 if type == tokenize.NAME: self.started = 1
509 elif type == tokenize.NEWLINE:
510 self.last = srow
511 elif type == tokenize.INDENT:
512 self.indent = self.indent + 1
513 elif type == tokenize.DEDENT:
514 self.indent = self.indent - 1
515 if self.indent == 0: raise EndOfBlock, self.last
Raymond Hettinger2e7b7482003-01-19 13:21:20 +0000516 elif type == tokenize.NAME and scol == 0:
517 raise EndOfBlock, self.last
Tim Peters4efb6e92001-06-29 23:51:08 +0000518
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000519def getblock(lines):
520 """Extract the block of code at the top of the given list of lines."""
Tim Peters4efb6e92001-06-29 23:51:08 +0000521 try:
522 tokenize.tokenize(ListReader(lines).readline, BlockFinder().tokeneater)
523 except EndOfBlock, eob:
524 return lines[:eob.args[0]]
Raymond Hettinger2d375f72003-01-14 02:19:36 +0000525 # Fooling the indent/dedent logic implies a one-line definition
526 return lines[:1]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000527
528def getsourcelines(object):
529 """Return a list of source lines and starting line number for an object.
530
531 The argument may be a module, class, method, function, traceback, frame,
532 or code object. The source code is returned as a list of the lines
533 corresponding to the object and the line number indicates where in the
534 original source file the first line of code was found. An IOError is
535 raised if the source code cannot be retrieved."""
536 lines, lnum = findsource(object)
537
538 if ismodule(object): return lines, 0
539 else: return getblock(lines[lnum:]), lnum + 1
540
541def getsource(object):
542 """Return the text of the source code for an object.
543
544 The argument may be a module, class, method, function, traceback, frame,
545 or code object. The source code is returned as a single string. An
546 IOError is raised if the source code cannot be retrieved."""
547 lines, lnum = getsourcelines(object)
548 return string.join(lines, '')
549
550# --------------------------------------------------- class tree extraction
551def walktree(classes, children, parent):
552 """Recursive helper function for getclasstree()."""
553 results = []
554 classes.sort(lambda a, b: cmp(a.__name__, b.__name__))
555 for c in classes:
556 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000557 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000558 results.append(walktree(children[c], children, c))
559 return results
560
561def getclasstree(classes, unique=0):
562 """Arrange the given list of classes into a hierarchy of nested lists.
563
564 Where a nested list appears, it contains classes derived from the class
565 whose entry immediately precedes the list. Each entry is a 2-tuple
566 containing a class and a tuple of its base classes. If the 'unique'
567 argument is true, exactly one entry appears in the returned structure
568 for each class in the given list. Otherwise, classes using multiple
569 inheritance and their descendants will appear multiple times."""
570 children = {}
571 roots = []
572 for c in classes:
573 if c.__bases__:
574 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000575 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000576 children[parent] = []
577 children[parent].append(c)
578 if unique and parent in classes: break
579 elif c not in roots:
580 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000581 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000582 if parent not in classes:
583 roots.append(parent)
584 return walktree(roots, children, None)
585
586# ------------------------------------------------ argument list extraction
587# These constants are from Python's compile.h.
588CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8
589
590def getargs(co):
591 """Get information about the arguments accepted by a code object.
592
593 Three things are returned: (args, varargs, varkw), where 'args' is
594 a list of argument names (possibly containing nested lists), and
595 'varargs' and 'varkw' are the names of the * and ** arguments or None."""
596 if not iscode(co): raise TypeError, 'arg is not a code object'
597
598 code = co.co_code
599 nargs = co.co_argcount
600 names = co.co_varnames
601 args = list(names[:nargs])
602 step = 0
603
604 # The following acrobatics are for anonymous (tuple) arguments.
605 for i in range(nargs):
606 if args[i][:1] in ['', '.']:
607 stack, remain, count = [], [], []
608 while step < len(code):
609 op = ord(code[step])
610 step = step + 1
611 if op >= dis.HAVE_ARGUMENT:
612 opname = dis.opname[op]
613 value = ord(code[step]) + ord(code[step+1])*256
614 step = step + 2
615 if opname in ['UNPACK_TUPLE', 'UNPACK_SEQUENCE']:
616 remain.append(value)
617 count.append(value)
618 elif opname == 'STORE_FAST':
619 stack.append(names[value])
620 remain[-1] = remain[-1] - 1
621 while remain[-1] == 0:
622 remain.pop()
623 size = count.pop()
624 stack[-size:] = [stack[-size:]]
625 if not remain: break
626 remain[-1] = remain[-1] - 1
627 if not remain: break
628 args[i] = stack[0]
629
630 varargs = None
631 if co.co_flags & CO_VARARGS:
632 varargs = co.co_varnames[nargs]
633 nargs = nargs + 1
634 varkw = None
635 if co.co_flags & CO_VARKEYWORDS:
636 varkw = co.co_varnames[nargs]
637 return args, varargs, varkw
638
639def getargspec(func):
640 """Get the names and default values of a function's arguments.
641
642 A tuple of four things is returned: (args, varargs, varkw, defaults).
643 'args' is a list of the argument names (it may contain nested lists).
644 'varargs' and 'varkw' are the names of the * and ** arguments or None.
645 'defaults' is an n-tuple of the default values of the last n arguments."""
646 if not isfunction(func): raise TypeError, 'arg is not a Python function'
647 args, varargs, varkw = getargs(func.func_code)
648 return args, varargs, varkw, func.func_defaults
649
650def getargvalues(frame):
651 """Get information about arguments passed into a particular frame.
652
653 A tuple of four things is returned: (args, varargs, varkw, locals).
654 'args' is a list of the argument names (it may contain nested lists).
655 'varargs' and 'varkw' are the names of the * and ** arguments or None.
656 'locals' is the locals dictionary of the given frame."""
657 args, varargs, varkw = getargs(frame.f_code)
658 return args, varargs, varkw, frame.f_locals
659
660def joinseq(seq):
661 if len(seq) == 1:
662 return '(' + seq[0] + ',)'
663 else:
664 return '(' + string.join(seq, ', ') + ')'
665
666def strseq(object, convert, join=joinseq):
667 """Recursively walk a sequence, stringifying each element."""
668 if type(object) in [types.ListType, types.TupleType]:
669 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
670 else:
671 return convert(object)
672
673def formatargspec(args, varargs=None, varkw=None, defaults=None,
674 formatarg=str,
675 formatvarargs=lambda name: '*' + name,
676 formatvarkw=lambda name: '**' + name,
677 formatvalue=lambda value: '=' + repr(value),
678 join=joinseq):
679 """Format an argument spec from the 4 values returned by getargspec.
680
681 The first four arguments are (args, varargs, varkw, defaults). The
682 other four arguments are the corresponding optional formatting functions
683 that are called to turn names and values into strings. The ninth
684 argument is an optional function to format the sequence of arguments."""
685 specs = []
686 if defaults:
687 firstdefault = len(args) - len(defaults)
688 for i in range(len(args)):
689 spec = strseq(args[i], formatarg, join)
690 if defaults and i >= firstdefault:
691 spec = spec + formatvalue(defaults[i - firstdefault])
692 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000693 if varargs is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000694 specs.append(formatvarargs(varargs))
Raymond Hettinger936654b2002-06-01 03:06:31 +0000695 if varkw is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000696 specs.append(formatvarkw(varkw))
697 return '(' + string.join(specs, ', ') + ')'
698
699def formatargvalues(args, varargs, varkw, locals,
700 formatarg=str,
701 formatvarargs=lambda name: '*' + name,
702 formatvarkw=lambda name: '**' + name,
703 formatvalue=lambda value: '=' + repr(value),
704 join=joinseq):
705 """Format an argument spec from the 4 values returned by getargvalues.
706
707 The first four arguments are (args, varargs, varkw, locals). The
708 next four arguments are the corresponding optional formatting functions
709 that are called to turn names and values into strings. The ninth
710 argument is an optional function to format the sequence of arguments."""
711 def convert(name, locals=locals,
712 formatarg=formatarg, formatvalue=formatvalue):
713 return formatarg(name) + formatvalue(locals[name])
714 specs = []
715 for i in range(len(args)):
716 specs.append(strseq(args[i], convert, join))
717 if varargs:
718 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
719 if varkw:
720 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
721 return '(' + string.join(specs, ', ') + ')'
722
723# -------------------------------------------------- stack frame extraction
724def getframeinfo(frame, context=1):
725 """Get information about a frame or traceback object.
726
727 A tuple of five things is returned: the filename, the line number of
728 the current line, the function name, a list of lines of context from
729 the source code, and the index of the current line within that list.
730 The optional second argument specifies the number of lines of context
731 to return, which are centered around the current line."""
732 if istraceback(frame):
733 frame = frame.tb_frame
734 if not isframe(frame):
735 raise TypeError, 'arg is not a frame or traceback object'
736
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000737 filename = getsourcefile(frame) or getfile(frame)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000738 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000739 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +0000740 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000741 try:
742 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000743 except IOError:
744 lines = index = None
745 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000746 start = max(start, 1)
747 start = min(start, len(lines) - context)
748 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000749 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000750 else:
751 lines = index = None
752
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000753 return (filename, lineno, frame.f_code.co_name, lines, index)
754
755def getlineno(frame):
756 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000757 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
758 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000759
760def getouterframes(frame, context=1):
761 """Get a list of records for a frame and all higher (calling) frames.
762
763 Each record contains a frame object, filename, line number, function
764 name, a list of lines of context, and index within the context."""
765 framelist = []
766 while frame:
767 framelist.append((frame,) + getframeinfo(frame, context))
768 frame = frame.f_back
769 return framelist
770
771def getinnerframes(tb, context=1):
772 """Get a list of records for a traceback's frame and all lower frames.
773
774 Each record contains a frame object, filename, line number, function
775 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000776 framelist = []
777 while tb:
778 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
779 tb = tb.tb_next
780 return framelist
781
782def currentframe():
783 """Return the frame object for the caller's stack frame."""
784 try:
Skip Montanaroa959a362002-03-25 21:37:54 +0000785 1/0
786 except ZeroDivisionError:
Fred Draked451ec12002-04-26 02:29:55 +0000787 return sys.exc_info()[2].tb_frame.f_back
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000788
789if hasattr(sys, '_getframe'): currentframe = sys._getframe
790
791def stack(context=1):
792 """Return a list of records for the stack above the caller's frame."""
793 return getouterframes(currentframe().f_back, context)
794
795def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +0000796 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +0000797 return getinnerframes(sys.exc_info()[2], context)