blob: 2c8614a1f147f1a0f36af386a8cf422b494dc40c [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
Christian Heimes608c1d82008-03-03 18:28:04 +000041from abc import ABCMeta
Raymond Hettingera1a992c2005-03-11 06:46:45 +000042from operator import attrgetter
Raymond Hettingere896acc2008-01-11 03:04:50 +000043from collections import namedtuple
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000044
Brett Cannonf5eb2ff2008-08-01 01:40:24 +000045# These constants are from Include/code.h.
46CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 0x1, 0x2, 0x4, 0x8
47CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
Christian Heimes608c1d82008-03-03 18:28:04 +000048# See Include/object.h
49TPFLAGS_IS_ABSTRACT = 1 << 20
50
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000051# ----------------------------------------------------------- type-checking
52def ismodule(object):
53 """Return true if the object is a module.
54
55 Module objects provide these attributes:
56 __doc__ documentation string
57 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000058 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000059
60def isclass(object):
61 """Return true if the object is a class.
62
63 Class objects provide these attributes:
64 __doc__ documentation string
65 __module__ name of module in which this class was defined"""
Tim Peters28bc59f2001-09-16 08:40:16 +000066 return isinstance(object, types.ClassType) or hasattr(object, '__bases__')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000067
68def ismethod(object):
69 """Return true if the object is an instance method.
70
71 Instance method objects provide these attributes:
72 __doc__ documentation string
73 __name__ name with which this method was defined
74 im_class class object in which this method belongs
75 im_func function object containing implementation of method
76 im_self instance to which this method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +000077 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000078
Tim Peters536d2262001-09-20 05:13:38 +000079def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000080 """Return true if the object is a method descriptor.
81
82 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000083
84 This is new in Python 2.2, and, for example, is true of int.__add__.
85 An object passing this test has a __get__ attribute but not a __set__
86 attribute, but beyond that the set of attributes varies. __name__ is
87 usually sensible, and __doc__ often is.
88
Tim Petersf1d90b92001-09-20 05:47:55 +000089 Methods implemented via descriptors that also pass one of the other
90 tests return false from the ismethoddescriptor() test, simply because
91 the other tests promise more -- you can, e.g., count on having the
92 im_func attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000093 return (hasattr(object, "__get__")
94 and not hasattr(object, "__set__") # else it's a data descriptor
95 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000096 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000097 and not isclass(object))
98
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000099def isdatadescriptor(object):
100 """Return true if the object is a data descriptor.
101
102 Data descriptors have both a __get__ and a __set__ attribute. Examples are
103 properties (defined in Python) and getsets and members (defined in C).
104 Typically, data descriptors will also have __name__ and __doc__ attributes
105 (properties, getsets, and members have both of these attributes), but this
106 is not guaranteed."""
107 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
108
Barry Warsaw00decd72006-07-27 23:43:15 +0000109if hasattr(types, 'MemberDescriptorType'):
110 # CPython and equivalent
111 def ismemberdescriptor(object):
112 """Return true if the object is a member descriptor.
113
114 Member descriptors are specialized descriptors defined in extension
115 modules."""
116 return isinstance(object, types.MemberDescriptorType)
117else:
118 # Other implementations
119 def ismemberdescriptor(object):
120 """Return true if the object is a member descriptor.
121
122 Member descriptors are specialized descriptors defined in extension
123 modules."""
124 return False
125
126if hasattr(types, 'GetSetDescriptorType'):
127 # CPython and equivalent
128 def isgetsetdescriptor(object):
129 """Return true if the object is a getset descriptor.
130
131 getset descriptors are specialized descriptors defined in extension
132 modules."""
133 return isinstance(object, types.GetSetDescriptorType)
134else:
135 # Other implementations
136 def isgetsetdescriptor(object):
137 """Return true if the object is a getset descriptor.
138
139 getset descriptors are specialized descriptors defined in extension
140 modules."""
141 return False
Tim Petersce70a3b2006-07-27 23:45:48 +0000142
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000143def isfunction(object):
144 """Return true if the object is a user-defined function.
145
146 Function objects provide these attributes:
147 __doc__ documentation string
148 __name__ name with which this function was defined
149 func_code code object containing compiled function bytecode
150 func_defaults tuple of any default values for arguments
151 func_doc (same as __doc__)
152 func_globals global namespace in which this function was defined
153 func_name (same as __name__)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000154 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000155
Facundo Batista759bfc62008-02-18 03:43:43 +0000156def isgeneratorfunction(object):
157 """Return true if the object is a user-defined generator function.
158
159 Generator function objects provides same attributes as functions.
160
161 See isfunction.__doc__ for attributes listing."""
162 if (isfunction(object) or ismethod(object)) and \
163 object.func_code.co_flags & CO_GENERATOR:
164 return True
165
166def isgenerator(object):
167 """Return true if the object is a generator.
168
169 Generator objects provide these attributes:
170 __iter__ defined to support interation over container
171 close raises a new GeneratorExit exception inside the
172 generator to terminate the iteration
173 gi_code code object
174 gi_frame frame object or possibly None once the generator has
175 been exhausted
176 gi_running set to 1 when generator is executing, 0 otherwise
177 next return the next item from the container
178 send resumes the generator and "sends" a value that becomes
179 the result of the current yield-expression
180 throw used to raise an exception inside the generator"""
181 return isinstance(object, types.GeneratorType)
182
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000183def istraceback(object):
184 """Return true if the object is a traceback.
185
186 Traceback objects provide these attributes:
187 tb_frame frame object at this level
188 tb_lasti index of last attempted instruction in bytecode
189 tb_lineno current line number in Python source code
190 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000191 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000192
193def isframe(object):
194 """Return true if the object is a frame object.
195
196 Frame objects provide these attributes:
197 f_back next outer frame object (this frame's caller)
198 f_builtins built-in namespace seen by this frame
199 f_code code object being executed in this frame
200 f_exc_traceback traceback if raised in this frame, or None
201 f_exc_type exception type if raised in this frame, or None
202 f_exc_value exception value if raised in this frame, or None
203 f_globals global namespace seen by this frame
204 f_lasti index of last attempted instruction in bytecode
205 f_lineno current line number in Python source code
206 f_locals local namespace seen by this frame
207 f_restricted 0 or 1 if frame is in restricted execution mode
208 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000209 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000210
211def iscode(object):
212 """Return true if the object is a code object.
213
214 Code objects provide these attributes:
215 co_argcount number of arguments (not including * or ** args)
216 co_code string of raw compiled bytecode
217 co_consts tuple of constants used in the bytecode
218 co_filename name of file in which this code object was created
219 co_firstlineno number of first line in Python source code
220 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
221 co_lnotab encoded mapping of line numbers to bytecode indices
222 co_name name with which this code object was defined
223 co_names tuple of names of local variables
224 co_nlocals number of local variables
225 co_stacksize virtual machine stack space required
226 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000227 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000228
229def isbuiltin(object):
230 """Return true if the object is a built-in function or method.
231
232 Built-in functions and methods provide these attributes:
233 __doc__ documentation string
234 __name__ original name of this function or method
235 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000236 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000237
238def isroutine(object):
239 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000240 return (isbuiltin(object)
241 or isfunction(object)
242 or ismethod(object)
243 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000244
Facundo Batista759bfc62008-02-18 03:43:43 +0000245def isgenerator(object):
246 """Return true if the object is a generator object."""
247 return isinstance(object, types.GeneratorType)
248
Christian Heimes608c1d82008-03-03 18:28:04 +0000249def isabstract(object):
250 """Return true if the object is an abstract base class (ABC)."""
Amaury Forgeot d'Arc24f3c5c2008-04-08 21:51:57 +0000251 return isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT
Christian Heimes608c1d82008-03-03 18:28:04 +0000252
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000253def getmembers(object, predicate=None):
254 """Return all members of an object as (name, value) pairs sorted by name.
255 Optionally, only return members that satisfy a given predicate."""
256 results = []
257 for key in dir(object):
258 value = getattr(object, key)
259 if not predicate or predicate(value):
260 results.append((key, value))
261 results.sort()
262 return results
263
Raymond Hettingere896acc2008-01-11 03:04:50 +0000264Attribute = namedtuple('Attribute', 'name kind defining_class object')
265
Tim Peters13b49d32001-09-23 02:00:29 +0000266def classify_class_attrs(cls):
267 """Return list of attribute-descriptor tuples.
268
269 For each name in dir(cls), the return list contains a 4-tuple
270 with these elements:
271
272 0. The name (a string).
273
274 1. The kind of attribute this is, one of these strings:
275 'class method' created via classmethod()
276 'static method' created via staticmethod()
277 'property' created via property()
278 'method' any other flavor of method
279 'data' not a method
280
281 2. The class which defined this attribute (a class).
282
283 3. The object as obtained directly from the defining class's
284 __dict__, not via getattr. This is especially important for
285 data attributes: C.data is just a data object, but
286 C.__dict__['data'] may be a data descriptor with additional
287 info, like a __doc__ string.
288 """
289
290 mro = getmro(cls)
291 names = dir(cls)
292 result = []
293 for name in names:
294 # Get the object associated with the name.
295 # Getting an obj from the __dict__ sometimes reveals more than
296 # using getattr. Static and class methods are dramatic examples.
297 if name in cls.__dict__:
298 obj = cls.__dict__[name]
299 else:
300 obj = getattr(cls, name)
301
302 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000303 homecls = getattr(obj, "__objclass__", None)
304 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000305 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000306 for base in mro:
307 if name in base.__dict__:
308 homecls = base
309 break
310
311 # Get the object again, in order to get it from the defining
312 # __dict__ instead of via getattr (if possible).
313 if homecls is not None and name in homecls.__dict__:
314 obj = homecls.__dict__[name]
315
316 # Also get the object via getattr.
317 obj_via_getattr = getattr(cls, name)
318
319 # Classify the object.
320 if isinstance(obj, staticmethod):
321 kind = "static method"
322 elif isinstance(obj, classmethod):
323 kind = "class method"
324 elif isinstance(obj, property):
325 kind = "property"
326 elif (ismethod(obj_via_getattr) or
327 ismethoddescriptor(obj_via_getattr)):
328 kind = "method"
329 else:
330 kind = "data"
331
Raymond Hettingere896acc2008-01-11 03:04:50 +0000332 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000333
334 return result
335
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000336# ----------------------------------------------------------- class helpers
337def _searchbases(cls, accum):
338 # Simulate the "classic class" search order.
339 if cls in accum:
340 return
341 accum.append(cls)
342 for base in cls.__bases__:
343 _searchbases(base, accum)
344
345def getmro(cls):
346 "Return tuple of base classes (including cls) in method resolution order."
347 if hasattr(cls, "__mro__"):
348 return cls.__mro__
349 else:
350 result = []
351 _searchbases(cls, result)
352 return tuple(result)
353
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000354# -------------------------------------------------- source code extraction
355def indentsize(line):
356 """Return the indent size, in spaces, at the start of a line of text."""
357 expline = string.expandtabs(line)
358 return len(expline) - len(string.lstrip(expline))
359
360def getdoc(object):
361 """Get the documentation string for an object.
362
363 All tabs are expanded to spaces. To clean up docstrings that are
364 indented to line up with blocks of code, any whitespace than can be
365 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000366 try:
367 doc = object.__doc__
368 except AttributeError:
369 return None
Michael W. Hudson755f75e2002-05-20 17:29:46 +0000370 if not isinstance(doc, types.StringTypes):
Tim Peters24008312002-03-17 18:56:20 +0000371 return None
Georg Brandl7be19aa2008-06-07 15:59:10 +0000372 return cleandoc(doc)
373
374def cleandoc(doc):
375 """Clean up indentation from docstrings.
376
377 Any whitespace that can be uniformly removed from the second line
378 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000379 try:
380 lines = string.split(string.expandtabs(doc), '\n')
381 except UnicodeError:
382 return None
383 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000384 # Find minimum indentation of any non-blank lines after first line.
385 margin = sys.maxint
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000386 for line in lines[1:]:
387 content = len(string.lstrip(line))
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000388 if content:
389 indent = len(line) - content
390 margin = min(margin, indent)
391 # Remove indentation.
392 if lines:
393 lines[0] = lines[0].lstrip()
394 if margin < sys.maxint:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000395 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000396 # Remove any trailing or leading blank lines.
397 while lines and not lines[-1]:
398 lines.pop()
399 while lines and not lines[0]:
400 lines.pop(0)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000401 return string.join(lines, '\n')
402
403def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000404 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000405 if ismodule(object):
406 if hasattr(object, '__file__'):
407 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000408 raise TypeError('arg is a built-in module')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000409 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000410 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000411 if hasattr(object, '__file__'):
412 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000413 raise TypeError('arg is a built-in class')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000414 if ismethod(object):
415 object = object.im_func
416 if isfunction(object):
417 object = object.func_code
418 if istraceback(object):
419 object = object.tb_frame
420 if isframe(object):
421 object = object.f_code
422 if iscode(object):
423 return object.co_filename
Tim Peters478c1052003-06-29 05:46:54 +0000424 raise TypeError('arg is not a module, class, method, '
Jeremy Hyltonab919022003-06-27 18:41:20 +0000425 'function, traceback, frame, or code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000426
Raymond Hettingere896acc2008-01-11 03:04:50 +0000427ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
428
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000429def getmoduleinfo(path):
430 """Get the module name, suffix, mode, and module type for a given file."""
431 filename = os.path.basename(path)
Brett Cannonf5eb2ff2008-08-01 01:40:24 +0000432 suffixes = map(lambda info:
433 (-len(info[0]), info[0], info[1], info[2]),
434 imp.get_suffixes())
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000435 suffixes.sort() # try longest suffixes first, in case they overlap
436 for neglen, suffix, mode, mtype in suffixes:
437 if filename[neglen:] == suffix:
Raymond Hettingere896acc2008-01-11 03:04:50 +0000438 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000439
440def getmodulename(path):
441 """Return the module name for a given file, or None."""
442 info = getmoduleinfo(path)
443 if info: return info[0]
444
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000445def getsourcefile(object):
446 """Return the Python source file an object was defined in, if it exists."""
447 filename = getfile(object)
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000448 if string.lower(filename[-4:]) in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000449 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000450 for suffix, mode, kind in imp.get_suffixes():
451 if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
452 # Looks like a binary file. We want to only return a text file.
453 return None
Phillip J. Eby72ae6c82006-04-30 15:59:26 +0000454 if os.path.exists(filename):
455 return filename
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000456 # only return a non-existent filename if the module has a PEP 302 loader
457 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000458 return filename
459
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000460def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000461 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000462
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000463 The idea is for each object to have a unique origin, so this routine
464 normalizes the result as much as possible."""
Phillip J. Eby1a2959c2006-07-20 15:54:16 +0000465 if _filename is None:
466 _filename = getsourcefile(object) or getfile(object)
467 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000468
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000469modulesbyfile = {}
Nick Coghlanc495c662006-09-07 10:50:34 +0000470_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000471
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000472def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000473 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000474 if ismodule(object):
475 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000476 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000477 return sys.modules.get(object.__module__)
Nick Coghlanc495c662006-09-07 10:50:34 +0000478 # Try the filename to modulename cache
479 if _filename is not None and _filename in modulesbyfile:
480 return sys.modules.get(modulesbyfile[_filename])
481 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000482 try:
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000483 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000484 except TypeError:
485 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000486 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000487 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000488 # Update the filename to module name cache and check yet again
489 # Copy sys.modules in order to cope with changes while iterating
490 for modname, module in sys.modules.items():
Phillip J. Eby47032112006-04-11 01:07:43 +0000491 if ismodule(module) and hasattr(module, '__file__'):
Nick Coghlanc495c662006-09-07 10:50:34 +0000492 f = module.__file__
493 if f == _filesbymodname.get(modname, None):
494 # Have already mapped this module, so skip it
495 continue
496 _filesbymodname[modname] = f
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000497 f = getabsfile(module)
Nick Coghlanc495c662006-09-07 10:50:34 +0000498 # Always map to the name the module knows itself by
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000499 modulesbyfile[f] = modulesbyfile[
500 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000501 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000502 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000503 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000504 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000505 if not hasattr(object, '__name__'):
506 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000507 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000508 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000509 if mainobject is object:
510 return main
Nick Coghlanc495c662006-09-07 10:50:34 +0000511 # Check builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000512 builtin = sys.modules['__builtin__']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000513 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000514 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000515 if builtinobject is object:
516 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000517
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000518def findsource(object):
519 """Return the entire source file and starting line number for an object.
520
521 The argument may be a module, class, method, function, traceback, frame,
522 or code object. The source code is returned as a list of all the lines
523 in the file and the line number indexes a line in that list. An IOError
524 is raised if the source code cannot be retrieved."""
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000525 file = getsourcefile(object) or getfile(object)
Nick Coghlanc495c662006-09-07 10:50:34 +0000526 module = getmodule(object, file)
Georg Brandl208badd2006-04-30 17:42:26 +0000527 if module:
528 lines = linecache.getlines(file, module.__dict__)
529 else:
530 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000531 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000532 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000533
534 if ismodule(object):
535 return lines, 0
536
537 if isclass(object):
538 name = object.__name__
Georg Brandlb2e81e32006-10-12 09:20:33 +0000539 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
540 # make some effort to find the best matching class definition:
541 # use the one with the least indentation, which is the one
542 # that's most probably not inside a function definition.
543 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000544 for i in range(len(lines)):
Georg Brandlb2e81e32006-10-12 09:20:33 +0000545 match = pat.match(lines[i])
546 if match:
547 # if it's at toplevel, it's already the best one
548 if lines[i][0] == 'c':
549 return lines, i
550 # else add whitespace to candidate list
551 candidates.append((match.group(1), i))
552 if candidates:
553 # this will sort by whitespace, and by line number,
554 # less whitespace first
555 candidates.sort()
556 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000557 else:
558 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000559
560 if ismethod(object):
561 object = object.im_func
562 if isfunction(object):
563 object = object.func_code
564 if istraceback(object):
565 object = object.tb_frame
566 if isframe(object):
567 object = object.f_code
568 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000569 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000570 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000571 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000572 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000573 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000574 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000575 lnum = lnum - 1
576 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000577 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000578
579def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000580 """Get lines of comments immediately preceding an object's source code.
581
582 Returns None when source can't be found.
583 """
584 try:
585 lines, lnum = findsource(object)
586 except (IOError, TypeError):
587 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000588
589 if ismodule(object):
590 # Look for a comment block at the top of the file.
591 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000592 if lines and lines[0][:2] == '#!': start = 1
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000593 while start < len(lines) and string.strip(lines[start]) in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000594 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000595 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000596 comments = []
597 end = start
598 while end < len(lines) and lines[end][:1] == '#':
599 comments.append(string.expandtabs(lines[end]))
600 end = end + 1
601 return string.join(comments, '')
602
603 # Look for a preceding block of comments at the same indentation.
604 elif lnum > 0:
605 indent = indentsize(lines[lnum])
606 end = lnum - 1
607 if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
608 indentsize(lines[end]) == indent:
609 comments = [string.lstrip(string.expandtabs(lines[end]))]
610 if end > 0:
611 end = end - 1
612 comment = string.lstrip(string.expandtabs(lines[end]))
613 while comment[:1] == '#' and indentsize(lines[end]) == indent:
614 comments[:0] = [comment]
615 end = end - 1
616 if end < 0: break
617 comment = string.lstrip(string.expandtabs(lines[end]))
618 while comments and string.strip(comments[0]) == '#':
619 comments[:1] = []
620 while comments and string.strip(comments[-1]) == '#':
621 comments[-1:] = []
622 return string.join(comments, '')
623
Tim Peters4efb6e92001-06-29 23:51:08 +0000624class EndOfBlock(Exception): pass
625
626class BlockFinder:
627 """Provide a tokeneater() method to detect the end of a code block."""
628 def __init__(self):
629 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000630 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000631 self.started = False
632 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000633 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000634
Brett Cannonf5eb2ff2008-08-01 01:40:24 +0000635 def tokeneater(self, type, token, srow_scol, erow_ecol, line):
636 srow, scol = srow_scol
637 erow, ecol = erow_ecol
Tim Peters4efb6e92001-06-29 23:51:08 +0000638 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000639 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000640 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000641 if token == "lambda":
642 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000643 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000644 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000645 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000646 self.passline = False # stop skipping when a NEWLINE is seen
Tim Peters4efb6e92001-06-29 23:51:08 +0000647 self.last = srow
Armin Rigodd5c0232005-09-25 11:45:45 +0000648 if self.islambda: # lambdas always end at the first NEWLINE
649 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000650 elif self.passline:
651 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000652 elif type == tokenize.INDENT:
653 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000654 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000655 elif type == tokenize.DEDENT:
656 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000657 # the end of matching indent/dedent pairs end a block
658 # (note that this only works for "def"/"class" blocks,
659 # not e.g. for "if: else:" or "try: finally:" blocks)
660 if self.indent <= 0:
661 raise EndOfBlock
662 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
663 # any other token on the same indentation level end the previous
664 # block as well, except the pseudo-tokens COMMENT and NL.
665 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000666
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000667def getblock(lines):
668 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000669 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000670 try:
Armin Rigodd5c0232005-09-25 11:45:45 +0000671 tokenize.tokenize(iter(lines).next, blockfinder.tokeneater)
672 except (EndOfBlock, IndentationError):
673 pass
674 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000675
676def getsourcelines(object):
677 """Return a list of source lines and starting line number for an object.
678
679 The argument may be a module, class, method, function, traceback, frame,
680 or code object. The source code is returned as a list of the lines
681 corresponding to the object and the line number indicates where in the
682 original source file the first line of code was found. An IOError is
683 raised if the source code cannot be retrieved."""
684 lines, lnum = findsource(object)
685
686 if ismodule(object): return lines, 0
687 else: return getblock(lines[lnum:]), lnum + 1
688
689def getsource(object):
690 """Return the text of the source code for an object.
691
692 The argument may be a module, class, method, function, traceback, frame,
693 or code object. The source code is returned as a single string. An
694 IOError is raised if the source code cannot be retrieved."""
695 lines, lnum = getsourcelines(object)
696 return string.join(lines, '')
697
698# --------------------------------------------------- class tree extraction
699def walktree(classes, children, parent):
700 """Recursive helper function for getclasstree()."""
701 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000702 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000703 for c in classes:
704 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000705 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000706 results.append(walktree(children[c], children, c))
707 return results
708
709def getclasstree(classes, unique=0):
710 """Arrange the given list of classes into a hierarchy of nested lists.
711
712 Where a nested list appears, it contains classes derived from the class
713 whose entry immediately precedes the list. Each entry is a 2-tuple
714 containing a class and a tuple of its base classes. If the 'unique'
715 argument is true, exactly one entry appears in the returned structure
716 for each class in the given list. Otherwise, classes using multiple
717 inheritance and their descendants will appear multiple times."""
718 children = {}
719 roots = []
720 for c in classes:
721 if c.__bases__:
722 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000723 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000724 children[parent] = []
725 children[parent].append(c)
726 if unique and parent in classes: break
727 elif c not in roots:
728 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000729 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000730 if parent not in classes:
731 roots.append(parent)
732 return walktree(roots, children, None)
733
734# ------------------------------------------------ argument list extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000735Arguments = namedtuple('Arguments', 'args varargs keywords')
736
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000737def getargs(co):
738 """Get information about the arguments accepted by a code object.
739
740 Three things are returned: (args, varargs, varkw), where 'args' is
741 a list of argument names (possibly containing nested lists), and
742 'varargs' and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000743
744 if not iscode(co):
745 raise TypeError('arg is not a code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000746
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000747 nargs = co.co_argcount
748 names = co.co_varnames
749 args = list(names[:nargs])
750 step = 0
751
752 # The following acrobatics are for anonymous (tuple) arguments.
753 for i in range(nargs):
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000754 if args[i][:1] in ('', '.'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000755 stack, remain, count = [], [], []
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000756 while step < len(co.co_code):
757 op = ord(co.co_code[step])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000758 step = step + 1
759 if op >= dis.HAVE_ARGUMENT:
760 opname = dis.opname[op]
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000761 value = ord(co.co_code[step]) + ord(co.co_code[step+1])*256
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000762 step = step + 2
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000763 if opname in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000764 remain.append(value)
765 count.append(value)
766 elif opname == 'STORE_FAST':
767 stack.append(names[value])
Matthias Klose2e829c02004-08-15 17:04:33 +0000768
769 # Special case for sublists of length 1: def foo((bar))
770 # doesn't generate the UNPACK_TUPLE bytecode, so if
771 # `remain` is empty here, we have such a sublist.
772 if not remain:
773 stack[0] = [stack[0]]
774 break
775 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000776 remain[-1] = remain[-1] - 1
Matthias Klose2e829c02004-08-15 17:04:33 +0000777 while remain[-1] == 0:
778 remain.pop()
779 size = count.pop()
780 stack[-size:] = [stack[-size:]]
781 if not remain: break
782 remain[-1] = remain[-1] - 1
783 if not remain: break
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000784 args[i] = stack[0]
785
786 varargs = None
787 if co.co_flags & CO_VARARGS:
788 varargs = co.co_varnames[nargs]
789 nargs = nargs + 1
790 varkw = None
791 if co.co_flags & CO_VARKEYWORDS:
792 varkw = co.co_varnames[nargs]
Raymond Hettingere896acc2008-01-11 03:04:50 +0000793 return Arguments(args, varargs, varkw)
794
795ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000796
797def getargspec(func):
798 """Get the names and default values of a function's arguments.
799
800 A tuple of four things is returned: (args, varargs, varkw, defaults).
801 'args' is a list of the argument names (it may contain nested lists).
802 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000803 'defaults' is an n-tuple of the default values of the last n arguments.
804 """
805
806 if ismethod(func):
807 func = func.im_func
808 if not isfunction(func):
809 raise TypeError('arg is not a Python function')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000810 args, varargs, varkw = getargs(func.func_code)
Raymond Hettingere896acc2008-01-11 03:04:50 +0000811 return ArgSpec(args, varargs, varkw, func.func_defaults)
812
813ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000814
815def getargvalues(frame):
816 """Get information about arguments passed into a particular frame.
817
818 A tuple of four things is returned: (args, varargs, varkw, locals).
819 'args' is a list of the argument names (it may contain nested lists).
820 'varargs' and 'varkw' are the names of the * and ** arguments or None.
821 'locals' is the locals dictionary of the given frame."""
822 args, varargs, varkw = getargs(frame.f_code)
823 return args, varargs, varkw, frame.f_locals
824
825def joinseq(seq):
826 if len(seq) == 1:
827 return '(' + seq[0] + ',)'
828 else:
829 return '(' + string.join(seq, ', ') + ')'
830
831def strseq(object, convert, join=joinseq):
832 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000833 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000834 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
835 else:
836 return convert(object)
837
838def formatargspec(args, varargs=None, varkw=None, defaults=None,
839 formatarg=str,
840 formatvarargs=lambda name: '*' + name,
841 formatvarkw=lambda name: '**' + name,
842 formatvalue=lambda value: '=' + repr(value),
843 join=joinseq):
844 """Format an argument spec from the 4 values returned by getargspec.
845
846 The first four arguments are (args, varargs, varkw, defaults). The
847 other four arguments are the corresponding optional formatting functions
848 that are called to turn names and values into strings. The ninth
849 argument is an optional function to format the sequence of arguments."""
850 specs = []
851 if defaults:
852 firstdefault = len(args) - len(defaults)
853 for i in range(len(args)):
854 spec = strseq(args[i], formatarg, join)
855 if defaults and i >= firstdefault:
856 spec = spec + formatvalue(defaults[i - firstdefault])
857 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000858 if varargs is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000859 specs.append(formatvarargs(varargs))
Raymond Hettinger936654b2002-06-01 03:06:31 +0000860 if varkw is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000861 specs.append(formatvarkw(varkw))
862 return '(' + string.join(specs, ', ') + ')'
863
864def formatargvalues(args, varargs, varkw, locals,
865 formatarg=str,
866 formatvarargs=lambda name: '*' + name,
867 formatvarkw=lambda name: '**' + name,
868 formatvalue=lambda value: '=' + repr(value),
869 join=joinseq):
870 """Format an argument spec from the 4 values returned by getargvalues.
871
872 The first four arguments are (args, varargs, varkw, locals). The
873 next four arguments are the corresponding optional formatting functions
874 that are called to turn names and values into strings. The ninth
875 argument is an optional function to format the sequence of arguments."""
876 def convert(name, locals=locals,
877 formatarg=formatarg, formatvalue=formatvalue):
878 return formatarg(name) + formatvalue(locals[name])
879 specs = []
880 for i in range(len(args)):
881 specs.append(strseq(args[i], convert, join))
882 if varargs:
883 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
884 if varkw:
885 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
886 return '(' + string.join(specs, ', ') + ')'
887
888# -------------------------------------------------- stack frame extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000889
890Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
891
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000892def getframeinfo(frame, context=1):
893 """Get information about a frame or traceback object.
894
895 A tuple of five things is returned: the filename, the line number of
896 the current line, the function name, a list of lines of context from
897 the source code, and the index of the current line within that list.
898 The optional second argument specifies the number of lines of context
899 to return, which are centered around the current line."""
900 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000901 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000902 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000903 else:
904 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000905 if not isframe(frame):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000906 raise TypeError('arg is not a frame or traceback object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000907
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000908 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000909 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +0000910 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000911 try:
912 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000913 except IOError:
914 lines = index = None
915 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000916 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +0000917 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000918 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000919 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000920 else:
921 lines = index = None
922
Raymond Hettingere896acc2008-01-11 03:04:50 +0000923 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000924
925def getlineno(frame):
926 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000927 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
928 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000929
930def getouterframes(frame, context=1):
931 """Get a list of records for a frame and all higher (calling) frames.
932
933 Each record contains a frame object, filename, line number, function
934 name, a list of lines of context, and index within the context."""
935 framelist = []
936 while frame:
937 framelist.append((frame,) + getframeinfo(frame, context))
938 frame = frame.f_back
939 return framelist
940
941def getinnerframes(tb, context=1):
942 """Get a list of records for a traceback's frame and all lower frames.
943
944 Each record contains a frame object, filename, line number, function
945 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000946 framelist = []
947 while tb:
948 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
949 tb = tb.tb_next
950 return framelist
951
Jeremy Hyltonab919022003-06-27 18:41:20 +0000952currentframe = sys._getframe
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000953
954def stack(context=1):
955 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +0000956 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000957
958def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +0000959 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +0000960 return getinnerframes(sys.exc_info()[2], context)