blob: 42f2c310bba5864fc705d343d7bfe20ce5b47f33 [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
Facundo Batista759bfc62008-02-18 03:43:43 +000010 ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
11 isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
12 isroutine() - check object types
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000013 getmembers() - get members of an object that satisfy a given condition
14
15 getfile(), getsourcefile(), getsource() - find an object's source code
16 getdoc(), getcomments() - get documentation on an object
17 getmodule() - determine the module that an object came from
18 getclasstree() - arrange classes so as to represent their hierarchy
19
20 getargspec(), getargvalues() - get info about function arguments
21 formatargspec(), formatargvalues() - format an argument spec
22 getouterframes(), getinnerframes() - get info about frames
23 currentframe() - get the current stack frame
24 stack(), trace() - get info about frames on the stack or in a traceback
25"""
26
27# This module is in the public domain. No warranties.
28
Ka-Ping Yee8b58b842001-03-01 13:56:16 +000029__author__ = 'Ka-Ping Yee <ping@lfw.org>'
30__date__ = '1 Jan 2001'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000031
Facundo Batista759bfc62008-02-18 03:43:43 +000032import sys
33import os
34import types
35import string
36import re
37import dis
38import imp
39import tokenize
40import linecache
Raymond Hettingera1a992c2005-03-11 06:46:45 +000041from operator import attrgetter
Raymond Hettingere896acc2008-01-11 03:04:50 +000042from collections import namedtuple
Facundo Batista759bfc62008-02-18 03:43:43 +000043from compiler.consts import (CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS,
44 CO_VARKEYWORDS, CO_GENERATOR)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000045
46# ----------------------------------------------------------- type-checking
47def ismodule(object):
48 """Return true if the object is a module.
49
50 Module objects provide these attributes:
51 __doc__ documentation string
52 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000053 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000054
55def isclass(object):
56 """Return true if the object is a class.
57
58 Class objects provide these attributes:
59 __doc__ documentation string
60 __module__ name of module in which this class was defined"""
Tim Peters28bc59f2001-09-16 08:40:16 +000061 return isinstance(object, types.ClassType) or hasattr(object, '__bases__')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000062
63def ismethod(object):
64 """Return true if the object is an instance method.
65
66 Instance method objects provide these attributes:
67 __doc__ documentation string
68 __name__ name with which this method was defined
69 im_class class object in which this method belongs
70 im_func function object containing implementation of method
71 im_self instance to which this method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +000072 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000073
Tim Peters536d2262001-09-20 05:13:38 +000074def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000075 """Return true if the object is a method descriptor.
76
77 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000078
79 This is new in Python 2.2, and, for example, is true of int.__add__.
80 An object passing this test has a __get__ attribute but not a __set__
81 attribute, but beyond that the set of attributes varies. __name__ is
82 usually sensible, and __doc__ often is.
83
Tim Petersf1d90b92001-09-20 05:47:55 +000084 Methods implemented via descriptors that also pass one of the other
85 tests return false from the ismethoddescriptor() test, simply because
86 the other tests promise more -- you can, e.g., count on having the
87 im_func attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000088 return (hasattr(object, "__get__")
89 and not hasattr(object, "__set__") # else it's a data descriptor
90 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000091 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000092 and not isclass(object))
93
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000094def isdatadescriptor(object):
95 """Return true if the object is a data descriptor.
96
97 Data descriptors have both a __get__ and a __set__ attribute. Examples are
98 properties (defined in Python) and getsets and members (defined in C).
99 Typically, data descriptors will also have __name__ and __doc__ attributes
100 (properties, getsets, and members have both of these attributes), but this
101 is not guaranteed."""
102 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
103
Barry Warsaw00decd72006-07-27 23:43:15 +0000104if hasattr(types, 'MemberDescriptorType'):
105 # CPython and equivalent
106 def ismemberdescriptor(object):
107 """Return true if the object is a member descriptor.
108
109 Member descriptors are specialized descriptors defined in extension
110 modules."""
111 return isinstance(object, types.MemberDescriptorType)
112else:
113 # Other implementations
114 def ismemberdescriptor(object):
115 """Return true if the object is a member descriptor.
116
117 Member descriptors are specialized descriptors defined in extension
118 modules."""
119 return False
120
121if hasattr(types, 'GetSetDescriptorType'):
122 # CPython and equivalent
123 def isgetsetdescriptor(object):
124 """Return true if the object is a getset descriptor.
125
126 getset descriptors are specialized descriptors defined in extension
127 modules."""
128 return isinstance(object, types.GetSetDescriptorType)
129else:
130 # Other implementations
131 def isgetsetdescriptor(object):
132 """Return true if the object is a getset descriptor.
133
134 getset descriptors are specialized descriptors defined in extension
135 modules."""
136 return False
Tim Petersce70a3b2006-07-27 23:45:48 +0000137
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000138def isfunction(object):
139 """Return true if the object is a user-defined function.
140
141 Function objects provide these attributes:
142 __doc__ documentation string
143 __name__ name with which this function was defined
144 func_code code object containing compiled function bytecode
145 func_defaults tuple of any default values for arguments
146 func_doc (same as __doc__)
147 func_globals global namespace in which this function was defined
148 func_name (same as __name__)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000149 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000150
Facundo Batista759bfc62008-02-18 03:43:43 +0000151def isgeneratorfunction(object):
152 """Return true if the object is a user-defined generator function.
153
154 Generator function objects provides same attributes as functions.
155
156 See isfunction.__doc__ for attributes listing."""
157 if (isfunction(object) or ismethod(object)) and \
158 object.func_code.co_flags & CO_GENERATOR:
159 return True
160
161def isgenerator(object):
162 """Return true if the object is a generator.
163
164 Generator objects provide these attributes:
165 __iter__ defined to support interation over container
166 close raises a new GeneratorExit exception inside the
167 generator to terminate the iteration
168 gi_code code object
169 gi_frame frame object or possibly None once the generator has
170 been exhausted
171 gi_running set to 1 when generator is executing, 0 otherwise
172 next return the next item from the container
173 send resumes the generator and "sends" a value that becomes
174 the result of the current yield-expression
175 throw used to raise an exception inside the generator"""
176 return isinstance(object, types.GeneratorType)
177
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000178def istraceback(object):
179 """Return true if the object is a traceback.
180
181 Traceback objects provide these attributes:
182 tb_frame frame object at this level
183 tb_lasti index of last attempted instruction in bytecode
184 tb_lineno current line number in Python source code
185 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000186 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000187
188def isframe(object):
189 """Return true if the object is a frame object.
190
191 Frame objects provide these attributes:
192 f_back next outer frame object (this frame's caller)
193 f_builtins built-in namespace seen by this frame
194 f_code code object being executed in this frame
195 f_exc_traceback traceback if raised in this frame, or None
196 f_exc_type exception type if raised in this frame, or None
197 f_exc_value exception value if raised in this frame, or None
198 f_globals global namespace seen by this frame
199 f_lasti index of last attempted instruction in bytecode
200 f_lineno current line number in Python source code
201 f_locals local namespace seen by this frame
202 f_restricted 0 or 1 if frame is in restricted execution mode
203 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000204 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000205
206def iscode(object):
207 """Return true if the object is a code object.
208
209 Code objects provide these attributes:
210 co_argcount number of arguments (not including * or ** args)
211 co_code string of raw compiled bytecode
212 co_consts tuple of constants used in the bytecode
213 co_filename name of file in which this code object was created
214 co_firstlineno number of first line in Python source code
215 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
216 co_lnotab encoded mapping of line numbers to bytecode indices
217 co_name name with which this code object was defined
218 co_names tuple of names of local variables
219 co_nlocals number of local variables
220 co_stacksize virtual machine stack space required
221 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000222 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000223
224def isbuiltin(object):
225 """Return true if the object is a built-in function or method.
226
227 Built-in functions and methods provide these attributes:
228 __doc__ documentation string
229 __name__ original name of this function or method
230 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000231 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000232
233def isroutine(object):
234 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000235 return (isbuiltin(object)
236 or isfunction(object)
237 or ismethod(object)
238 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000239
Facundo Batista759bfc62008-02-18 03:43:43 +0000240def isgenerator(object):
241 """Return true if the object is a generator object."""
242 return isinstance(object, types.GeneratorType)
243
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000244def getmembers(object, predicate=None):
245 """Return all members of an object as (name, value) pairs sorted by name.
246 Optionally, only return members that satisfy a given predicate."""
247 results = []
248 for key in dir(object):
249 value = getattr(object, key)
250 if not predicate or predicate(value):
251 results.append((key, value))
252 results.sort()
253 return results
254
Raymond Hettingere896acc2008-01-11 03:04:50 +0000255Attribute = namedtuple('Attribute', 'name kind defining_class object')
256
Tim Peters13b49d32001-09-23 02:00:29 +0000257def classify_class_attrs(cls):
258 """Return list of attribute-descriptor tuples.
259
260 For each name in dir(cls), the return list contains a 4-tuple
261 with these elements:
262
263 0. The name (a string).
264
265 1. The kind of attribute this is, one of these strings:
266 'class method' created via classmethod()
267 'static method' created via staticmethod()
268 'property' created via property()
269 'method' any other flavor of method
270 'data' not a method
271
272 2. The class which defined this attribute (a class).
273
274 3. The object as obtained directly from the defining class's
275 __dict__, not via getattr. This is especially important for
276 data attributes: C.data is just a data object, but
277 C.__dict__['data'] may be a data descriptor with additional
278 info, like a __doc__ string.
279 """
280
281 mro = getmro(cls)
282 names = dir(cls)
283 result = []
284 for name in names:
285 # Get the object associated with the name.
286 # Getting an obj from the __dict__ sometimes reveals more than
287 # using getattr. Static and class methods are dramatic examples.
288 if name in cls.__dict__:
289 obj = cls.__dict__[name]
290 else:
291 obj = getattr(cls, name)
292
293 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000294 homecls = getattr(obj, "__objclass__", None)
295 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000296 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000297 for base in mro:
298 if name in base.__dict__:
299 homecls = base
300 break
301
302 # Get the object again, in order to get it from the defining
303 # __dict__ instead of via getattr (if possible).
304 if homecls is not None and name in homecls.__dict__:
305 obj = homecls.__dict__[name]
306
307 # Also get the object via getattr.
308 obj_via_getattr = getattr(cls, name)
309
310 # Classify the object.
311 if isinstance(obj, staticmethod):
312 kind = "static method"
313 elif isinstance(obj, classmethod):
314 kind = "class method"
315 elif isinstance(obj, property):
316 kind = "property"
317 elif (ismethod(obj_via_getattr) or
318 ismethoddescriptor(obj_via_getattr)):
319 kind = "method"
320 else:
321 kind = "data"
322
Raymond Hettingere896acc2008-01-11 03:04:50 +0000323 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000324
325 return result
326
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000327# ----------------------------------------------------------- class helpers
328def _searchbases(cls, accum):
329 # Simulate the "classic class" search order.
330 if cls in accum:
331 return
332 accum.append(cls)
333 for base in cls.__bases__:
334 _searchbases(base, accum)
335
336def getmro(cls):
337 "Return tuple of base classes (including cls) in method resolution order."
338 if hasattr(cls, "__mro__"):
339 return cls.__mro__
340 else:
341 result = []
342 _searchbases(cls, result)
343 return tuple(result)
344
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000345# -------------------------------------------------- source code extraction
346def indentsize(line):
347 """Return the indent size, in spaces, at the start of a line of text."""
348 expline = string.expandtabs(line)
349 return len(expline) - len(string.lstrip(expline))
350
351def getdoc(object):
352 """Get the documentation string for an object.
353
354 All tabs are expanded to spaces. To clean up docstrings that are
355 indented to line up with blocks of code, any whitespace than can be
356 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000357 try:
358 doc = object.__doc__
359 except AttributeError:
360 return None
Michael W. Hudson755f75e2002-05-20 17:29:46 +0000361 if not isinstance(doc, types.StringTypes):
Tim Peters24008312002-03-17 18:56:20 +0000362 return None
363 try:
364 lines = string.split(string.expandtabs(doc), '\n')
365 except UnicodeError:
366 return None
367 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000368 # Find minimum indentation of any non-blank lines after first line.
369 margin = sys.maxint
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000370 for line in lines[1:]:
371 content = len(string.lstrip(line))
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000372 if content:
373 indent = len(line) - content
374 margin = min(margin, indent)
375 # Remove indentation.
376 if lines:
377 lines[0] = lines[0].lstrip()
378 if margin < sys.maxint:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000379 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000380 # Remove any trailing or leading blank lines.
381 while lines and not lines[-1]:
382 lines.pop()
383 while lines and not lines[0]:
384 lines.pop(0)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000385 return string.join(lines, '\n')
386
387def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000388 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000389 if ismodule(object):
390 if hasattr(object, '__file__'):
391 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000392 raise TypeError('arg is a built-in module')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000393 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000394 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000395 if hasattr(object, '__file__'):
396 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000397 raise TypeError('arg is a built-in class')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000398 if ismethod(object):
399 object = object.im_func
400 if isfunction(object):
401 object = object.func_code
402 if istraceback(object):
403 object = object.tb_frame
404 if isframe(object):
405 object = object.f_code
406 if iscode(object):
407 return object.co_filename
Tim Peters478c1052003-06-29 05:46:54 +0000408 raise TypeError('arg is not a module, class, method, '
Jeremy Hyltonab919022003-06-27 18:41:20 +0000409 'function, traceback, frame, or code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000410
Raymond Hettingere896acc2008-01-11 03:04:50 +0000411ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
412
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000413def getmoduleinfo(path):
414 """Get the module name, suffix, mode, and module type for a given file."""
415 filename = os.path.basename(path)
416 suffixes = map(lambda (suffix, mode, mtype):
417 (-len(suffix), suffix, mode, mtype), imp.get_suffixes())
418 suffixes.sort() # try longest suffixes first, in case they overlap
419 for neglen, suffix, mode, mtype in suffixes:
420 if filename[neglen:] == suffix:
Raymond Hettingere896acc2008-01-11 03:04:50 +0000421 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000422
423def getmodulename(path):
424 """Return the module name for a given file, or None."""
425 info = getmoduleinfo(path)
426 if info: return info[0]
427
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000428def getsourcefile(object):
429 """Return the Python source file an object was defined in, if it exists."""
430 filename = getfile(object)
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000431 if string.lower(filename[-4:]) in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000432 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000433 for suffix, mode, kind in imp.get_suffixes():
434 if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
435 # Looks like a binary file. We want to only return a text file.
436 return None
Phillip J. Eby72ae6c82006-04-30 15:59:26 +0000437 if os.path.exists(filename):
438 return filename
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000439 # only return a non-existent filename if the module has a PEP 302 loader
440 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000441 return filename
442
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000443def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000444 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000445
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000446 The idea is for each object to have a unique origin, so this routine
447 normalizes the result as much as possible."""
Phillip J. Eby1a2959c2006-07-20 15:54:16 +0000448 if _filename is None:
449 _filename = getsourcefile(object) or getfile(object)
450 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000451
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000452modulesbyfile = {}
Nick Coghlanc495c662006-09-07 10:50:34 +0000453_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000454
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000455def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000456 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000457 if ismodule(object):
458 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000459 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000460 return sys.modules.get(object.__module__)
Nick Coghlanc495c662006-09-07 10:50:34 +0000461 # Try the filename to modulename cache
462 if _filename is not None and _filename in modulesbyfile:
463 return sys.modules.get(modulesbyfile[_filename])
464 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000465 try:
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000466 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000467 except TypeError:
468 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000469 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000470 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000471 # Update the filename to module name cache and check yet again
472 # Copy sys.modules in order to cope with changes while iterating
473 for modname, module in sys.modules.items():
Phillip J. Eby47032112006-04-11 01:07:43 +0000474 if ismodule(module) and hasattr(module, '__file__'):
Nick Coghlanc495c662006-09-07 10:50:34 +0000475 f = module.__file__
476 if f == _filesbymodname.get(modname, None):
477 # Have already mapped this module, so skip it
478 continue
479 _filesbymodname[modname] = f
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000480 f = getabsfile(module)
Nick Coghlanc495c662006-09-07 10:50:34 +0000481 # Always map to the name the module knows itself by
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000482 modulesbyfile[f] = modulesbyfile[
483 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000484 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000485 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000486 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000487 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000488 if not hasattr(object, '__name__'):
489 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000490 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000491 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000492 if mainobject is object:
493 return main
Nick Coghlanc495c662006-09-07 10:50:34 +0000494 # Check builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000495 builtin = sys.modules['__builtin__']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000496 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000497 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000498 if builtinobject is object:
499 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000500
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000501def findsource(object):
502 """Return the entire source file and starting line number for an object.
503
504 The argument may be a module, class, method, function, traceback, frame,
505 or code object. The source code is returned as a list of all the lines
506 in the file and the line number indexes a line in that list. An IOError
507 is raised if the source code cannot be retrieved."""
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000508 file = getsourcefile(object) or getfile(object)
Nick Coghlanc495c662006-09-07 10:50:34 +0000509 module = getmodule(object, file)
Georg Brandl208badd2006-04-30 17:42:26 +0000510 if module:
511 lines = linecache.getlines(file, module.__dict__)
512 else:
513 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000514 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000515 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000516
517 if ismodule(object):
518 return lines, 0
519
520 if isclass(object):
521 name = object.__name__
Georg Brandlb2e81e32006-10-12 09:20:33 +0000522 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
523 # make some effort to find the best matching class definition:
524 # use the one with the least indentation, which is the one
525 # that's most probably not inside a function definition.
526 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000527 for i in range(len(lines)):
Georg Brandlb2e81e32006-10-12 09:20:33 +0000528 match = pat.match(lines[i])
529 if match:
530 # if it's at toplevel, it's already the best one
531 if lines[i][0] == 'c':
532 return lines, i
533 # else add whitespace to candidate list
534 candidates.append((match.group(1), i))
535 if candidates:
536 # this will sort by whitespace, and by line number,
537 # less whitespace first
538 candidates.sort()
539 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000540 else:
541 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000542
543 if ismethod(object):
544 object = object.im_func
545 if isfunction(object):
546 object = object.func_code
547 if istraceback(object):
548 object = object.tb_frame
549 if isframe(object):
550 object = object.f_code
551 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000552 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000553 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000554 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000555 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000556 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000557 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000558 lnum = lnum - 1
559 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000560 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000561
562def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000563 """Get lines of comments immediately preceding an object's source code.
564
565 Returns None when source can't be found.
566 """
567 try:
568 lines, lnum = findsource(object)
569 except (IOError, TypeError):
570 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000571
572 if ismodule(object):
573 # Look for a comment block at the top of the file.
574 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000575 if lines and lines[0][:2] == '#!': start = 1
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000576 while start < len(lines) and string.strip(lines[start]) in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000577 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000578 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000579 comments = []
580 end = start
581 while end < len(lines) and lines[end][:1] == '#':
582 comments.append(string.expandtabs(lines[end]))
583 end = end + 1
584 return string.join(comments, '')
585
586 # Look for a preceding block of comments at the same indentation.
587 elif lnum > 0:
588 indent = indentsize(lines[lnum])
589 end = lnum - 1
590 if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
591 indentsize(lines[end]) == indent:
592 comments = [string.lstrip(string.expandtabs(lines[end]))]
593 if end > 0:
594 end = end - 1
595 comment = string.lstrip(string.expandtabs(lines[end]))
596 while comment[:1] == '#' and indentsize(lines[end]) == indent:
597 comments[:0] = [comment]
598 end = end - 1
599 if end < 0: break
600 comment = string.lstrip(string.expandtabs(lines[end]))
601 while comments and string.strip(comments[0]) == '#':
602 comments[:1] = []
603 while comments and string.strip(comments[-1]) == '#':
604 comments[-1:] = []
605 return string.join(comments, '')
606
Tim Peters4efb6e92001-06-29 23:51:08 +0000607class EndOfBlock(Exception): pass
608
609class BlockFinder:
610 """Provide a tokeneater() method to detect the end of a code block."""
611 def __init__(self):
612 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000613 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000614 self.started = False
615 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000616 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000617
618 def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
619 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000620 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000621 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000622 if token == "lambda":
623 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000624 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000625 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000626 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000627 self.passline = False # stop skipping when a NEWLINE is seen
Tim Peters4efb6e92001-06-29 23:51:08 +0000628 self.last = srow
Armin Rigodd5c0232005-09-25 11:45:45 +0000629 if self.islambda: # lambdas always end at the first NEWLINE
630 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000631 elif self.passline:
632 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000633 elif type == tokenize.INDENT:
634 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000635 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000636 elif type == tokenize.DEDENT:
637 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000638 # the end of matching indent/dedent pairs end a block
639 # (note that this only works for "def"/"class" blocks,
640 # not e.g. for "if: else:" or "try: finally:" blocks)
641 if self.indent <= 0:
642 raise EndOfBlock
643 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
644 # any other token on the same indentation level end the previous
645 # block as well, except the pseudo-tokens COMMENT and NL.
646 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000647
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000648def getblock(lines):
649 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000650 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000651 try:
Armin Rigodd5c0232005-09-25 11:45:45 +0000652 tokenize.tokenize(iter(lines).next, blockfinder.tokeneater)
653 except (EndOfBlock, IndentationError):
654 pass
655 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000656
657def getsourcelines(object):
658 """Return a list of source lines and starting line number for an object.
659
660 The argument may be a module, class, method, function, traceback, frame,
661 or code object. The source code is returned as a list of the lines
662 corresponding to the object and the line number indicates where in the
663 original source file the first line of code was found. An IOError is
664 raised if the source code cannot be retrieved."""
665 lines, lnum = findsource(object)
666
667 if ismodule(object): return lines, 0
668 else: return getblock(lines[lnum:]), lnum + 1
669
670def getsource(object):
671 """Return the text of the source code for an object.
672
673 The argument may be a module, class, method, function, traceback, frame,
674 or code object. The source code is returned as a single string. An
675 IOError is raised if the source code cannot be retrieved."""
676 lines, lnum = getsourcelines(object)
677 return string.join(lines, '')
678
679# --------------------------------------------------- class tree extraction
680def walktree(classes, children, parent):
681 """Recursive helper function for getclasstree()."""
682 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000683 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000684 for c in classes:
685 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000686 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000687 results.append(walktree(children[c], children, c))
688 return results
689
690def getclasstree(classes, unique=0):
691 """Arrange the given list of classes into a hierarchy of nested lists.
692
693 Where a nested list appears, it contains classes derived from the class
694 whose entry immediately precedes the list. Each entry is a 2-tuple
695 containing a class and a tuple of its base classes. If the 'unique'
696 argument is true, exactly one entry appears in the returned structure
697 for each class in the given list. Otherwise, classes using multiple
698 inheritance and their descendants will appear multiple times."""
699 children = {}
700 roots = []
701 for c in classes:
702 if c.__bases__:
703 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000704 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000705 children[parent] = []
706 children[parent].append(c)
707 if unique and parent in classes: break
708 elif c not in roots:
709 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000710 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000711 if parent not in classes:
712 roots.append(parent)
713 return walktree(roots, children, None)
714
715# ------------------------------------------------ argument list extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000716Arguments = namedtuple('Arguments', 'args varargs keywords')
717
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000718def getargs(co):
719 """Get information about the arguments accepted by a code object.
720
721 Three things are returned: (args, varargs, varkw), where 'args' is
722 a list of argument names (possibly containing nested lists), and
723 'varargs' and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000724
725 if not iscode(co):
726 raise TypeError('arg is not a code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000727
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000728 nargs = co.co_argcount
729 names = co.co_varnames
730 args = list(names[:nargs])
731 step = 0
732
733 # The following acrobatics are for anonymous (tuple) arguments.
734 for i in range(nargs):
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000735 if args[i][:1] in ('', '.'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000736 stack, remain, count = [], [], []
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000737 while step < len(co.co_code):
738 op = ord(co.co_code[step])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000739 step = step + 1
740 if op >= dis.HAVE_ARGUMENT:
741 opname = dis.opname[op]
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000742 value = ord(co.co_code[step]) + ord(co.co_code[step+1])*256
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000743 step = step + 2
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000744 if opname in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000745 remain.append(value)
746 count.append(value)
747 elif opname == 'STORE_FAST':
748 stack.append(names[value])
Matthias Klose2e829c02004-08-15 17:04:33 +0000749
750 # Special case for sublists of length 1: def foo((bar))
751 # doesn't generate the UNPACK_TUPLE bytecode, so if
752 # `remain` is empty here, we have such a sublist.
753 if not remain:
754 stack[0] = [stack[0]]
755 break
756 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000757 remain[-1] = remain[-1] - 1
Matthias Klose2e829c02004-08-15 17:04:33 +0000758 while remain[-1] == 0:
759 remain.pop()
760 size = count.pop()
761 stack[-size:] = [stack[-size:]]
762 if not remain: break
763 remain[-1] = remain[-1] - 1
764 if not remain: break
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000765 args[i] = stack[0]
766
767 varargs = None
768 if co.co_flags & CO_VARARGS:
769 varargs = co.co_varnames[nargs]
770 nargs = nargs + 1
771 varkw = None
772 if co.co_flags & CO_VARKEYWORDS:
773 varkw = co.co_varnames[nargs]
Raymond Hettingere896acc2008-01-11 03:04:50 +0000774 return Arguments(args, varargs, varkw)
775
776ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000777
778def getargspec(func):
779 """Get the names and default values of a function's arguments.
780
781 A tuple of four things is returned: (args, varargs, varkw, defaults).
782 'args' is a list of the argument names (it may contain nested lists).
783 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000784 'defaults' is an n-tuple of the default values of the last n arguments.
785 """
786
787 if ismethod(func):
788 func = func.im_func
789 if not isfunction(func):
790 raise TypeError('arg is not a Python function')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000791 args, varargs, varkw = getargs(func.func_code)
Raymond Hettingere896acc2008-01-11 03:04:50 +0000792 return ArgSpec(args, varargs, varkw, func.func_defaults)
793
794ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000795
796def getargvalues(frame):
797 """Get information about arguments passed into a particular frame.
798
799 A tuple of four things is returned: (args, varargs, varkw, locals).
800 'args' is a list of the argument names (it may contain nested lists).
801 'varargs' and 'varkw' are the names of the * and ** arguments or None.
802 'locals' is the locals dictionary of the given frame."""
803 args, varargs, varkw = getargs(frame.f_code)
804 return args, varargs, varkw, frame.f_locals
805
806def joinseq(seq):
807 if len(seq) == 1:
808 return '(' + seq[0] + ',)'
809 else:
810 return '(' + string.join(seq, ', ') + ')'
811
812def strseq(object, convert, join=joinseq):
813 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000814 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000815 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
816 else:
817 return convert(object)
818
819def formatargspec(args, varargs=None, varkw=None, defaults=None,
820 formatarg=str,
821 formatvarargs=lambda name: '*' + name,
822 formatvarkw=lambda name: '**' + name,
823 formatvalue=lambda value: '=' + repr(value),
824 join=joinseq):
825 """Format an argument spec from the 4 values returned by getargspec.
826
827 The first four arguments are (args, varargs, varkw, defaults). The
828 other four arguments are the corresponding optional formatting functions
829 that are called to turn names and values into strings. The ninth
830 argument is an optional function to format the sequence of arguments."""
831 specs = []
832 if defaults:
833 firstdefault = len(args) - len(defaults)
834 for i in range(len(args)):
835 spec = strseq(args[i], formatarg, join)
836 if defaults and i >= firstdefault:
837 spec = spec + formatvalue(defaults[i - firstdefault])
838 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000839 if varargs is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000840 specs.append(formatvarargs(varargs))
Raymond Hettinger936654b2002-06-01 03:06:31 +0000841 if varkw is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000842 specs.append(formatvarkw(varkw))
843 return '(' + string.join(specs, ', ') + ')'
844
845def formatargvalues(args, varargs, varkw, locals,
846 formatarg=str,
847 formatvarargs=lambda name: '*' + name,
848 formatvarkw=lambda name: '**' + name,
849 formatvalue=lambda value: '=' + repr(value),
850 join=joinseq):
851 """Format an argument spec from the 4 values returned by getargvalues.
852
853 The first four arguments are (args, varargs, varkw, locals). The
854 next four arguments are the corresponding optional formatting functions
855 that are called to turn names and values into strings. The ninth
856 argument is an optional function to format the sequence of arguments."""
857 def convert(name, locals=locals,
858 formatarg=formatarg, formatvalue=formatvalue):
859 return formatarg(name) + formatvalue(locals[name])
860 specs = []
861 for i in range(len(args)):
862 specs.append(strseq(args[i], convert, join))
863 if varargs:
864 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
865 if varkw:
866 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
867 return '(' + string.join(specs, ', ') + ')'
868
869# -------------------------------------------------- stack frame extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000870
871Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
872
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000873def getframeinfo(frame, context=1):
874 """Get information about a frame or traceback object.
875
876 A tuple of five things is returned: the filename, the line number of
877 the current line, the function name, a list of lines of context from
878 the source code, and the index of the current line within that list.
879 The optional second argument specifies the number of lines of context
880 to return, which are centered around the current line."""
881 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000882 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000883 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000884 else:
885 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000886 if not isframe(frame):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000887 raise TypeError('arg is not a frame or traceback object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000888
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000889 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000890 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +0000891 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000892 try:
893 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000894 except IOError:
895 lines = index = None
896 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000897 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +0000898 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000899 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000900 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000901 else:
902 lines = index = None
903
Raymond Hettingere896acc2008-01-11 03:04:50 +0000904 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000905
906def getlineno(frame):
907 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000908 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
909 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000910
911def getouterframes(frame, context=1):
912 """Get a list of records for a frame and all higher (calling) frames.
913
914 Each record contains a frame object, filename, line number, function
915 name, a list of lines of context, and index within the context."""
916 framelist = []
917 while frame:
918 framelist.append((frame,) + getframeinfo(frame, context))
919 frame = frame.f_back
920 return framelist
921
922def getinnerframes(tb, context=1):
923 """Get a list of records for a traceback's frame and all lower frames.
924
925 Each record contains a frame object, filename, line number, function
926 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000927 framelist = []
928 while tb:
929 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
930 tb = tb.tb_next
931 return framelist
932
Jeremy Hyltonab919022003-06-27 18:41:20 +0000933currentframe = sys._getframe
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000934
935def stack(context=1):
936 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +0000937 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000938
939def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +0000940 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +0000941 return getinnerframes(sys.exc_info()[2], context)