blob: 3305c8d0400782dc53bbf9dcc47b964617cf2ab2 [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
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000043
Brett Cannonf5eb2ff2008-08-01 01:40:24 +000044# These constants are from Include/code.h.
45CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 0x1, 0x2, 0x4, 0x8
46CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
Christian Heimes608c1d82008-03-03 18:28:04 +000047# See Include/object.h
48TPFLAGS_IS_ABSTRACT = 1 << 20
49
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000050# ----------------------------------------------------------- type-checking
51def ismodule(object):
52 """Return true if the object is a module.
53
54 Module objects provide these attributes:
55 __doc__ documentation string
56 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000057 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000058
59def isclass(object):
60 """Return true if the object is a class.
61
62 Class objects provide these attributes:
63 __doc__ documentation string
64 __module__ name of module in which this class was defined"""
Benjamin Peterson5e5fbb62009-01-17 22:27:54 +000065 return isinstance(object, (type, types.ClassType))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000066
67def ismethod(object):
68 """Return true if the object is an instance method.
69
70 Instance method objects provide these attributes:
71 __doc__ documentation string
72 __name__ name with which this method was defined
73 im_class class object in which this method belongs
74 im_func function object containing implementation of method
75 im_self instance to which this method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +000076 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000077
Tim Peters536d2262001-09-20 05:13:38 +000078def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000079 """Return true if the object is a method descriptor.
80
81 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000082
83 This is new in Python 2.2, and, for example, is true of int.__add__.
84 An object passing this test has a __get__ attribute but not a __set__
85 attribute, but beyond that the set of attributes varies. __name__ is
86 usually sensible, and __doc__ often is.
87
Tim Petersf1d90b92001-09-20 05:47:55 +000088 Methods implemented via descriptors that also pass one of the other
89 tests return false from the ismethoddescriptor() test, simply because
90 the other tests promise more -- you can, e.g., count on having the
91 im_func attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000092 return (hasattr(object, "__get__")
93 and not hasattr(object, "__set__") # else it's a data descriptor
94 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000095 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000096 and not isclass(object))
97
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000098def isdatadescriptor(object):
99 """Return true if the object is a data descriptor.
100
101 Data descriptors have both a __get__ and a __set__ attribute. Examples are
102 properties (defined in Python) and getsets and members (defined in C).
103 Typically, data descriptors will also have __name__ and __doc__ attributes
104 (properties, getsets, and members have both of these attributes), but this
105 is not guaranteed."""
106 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
107
Barry Warsaw00decd72006-07-27 23:43:15 +0000108if hasattr(types, 'MemberDescriptorType'):
109 # CPython and equivalent
110 def ismemberdescriptor(object):
111 """Return true if the object is a member descriptor.
112
113 Member descriptors are specialized descriptors defined in extension
114 modules."""
115 return isinstance(object, types.MemberDescriptorType)
116else:
117 # Other implementations
118 def ismemberdescriptor(object):
119 """Return true if the object is a member descriptor.
120
121 Member descriptors are specialized descriptors defined in extension
122 modules."""
123 return False
124
125if hasattr(types, 'GetSetDescriptorType'):
126 # CPython and equivalent
127 def isgetsetdescriptor(object):
128 """Return true if the object is a getset descriptor.
129
130 getset descriptors are specialized descriptors defined in extension
131 modules."""
132 return isinstance(object, types.GetSetDescriptorType)
133else:
134 # Other implementations
135 def isgetsetdescriptor(object):
136 """Return true if the object is a getset descriptor.
137
138 getset descriptors are specialized descriptors defined in extension
139 modules."""
140 return False
Tim Petersce70a3b2006-07-27 23:45:48 +0000141
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000142def isfunction(object):
143 """Return true if the object is a user-defined function.
144
145 Function objects provide these attributes:
146 __doc__ documentation string
147 __name__ name with which this function was defined
148 func_code code object containing compiled function bytecode
149 func_defaults tuple of any default values for arguments
150 func_doc (same as __doc__)
151 func_globals global namespace in which this function was defined
152 func_name (same as __name__)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000153 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000154
Facundo Batista759bfc62008-02-18 03:43:43 +0000155def isgeneratorfunction(object):
156 """Return true if the object is a user-defined generator function.
157
158 Generator function objects provides same attributes as functions.
159
160 See isfunction.__doc__ for attributes listing."""
Benjamin Peterson6060d5e2009-01-01 04:04:41 +0000161 return bool((isfunction(object) or ismethod(object)) and
162 object.func_code.co_flags & CO_GENERATOR)
Facundo Batista759bfc62008-02-18 03:43:43 +0000163
164def isgenerator(object):
165 """Return true if the object is a generator.
166
167 Generator objects provide these attributes:
168 __iter__ defined to support interation over container
169 close raises a new GeneratorExit exception inside the
170 generator to terminate the iteration
171 gi_code code object
172 gi_frame frame object or possibly None once the generator has
173 been exhausted
174 gi_running set to 1 when generator is executing, 0 otherwise
175 next return the next item from the container
176 send resumes the generator and "sends" a value that becomes
177 the result of the current yield-expression
178 throw used to raise an exception inside the generator"""
179 return isinstance(object, types.GeneratorType)
180
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000181def istraceback(object):
182 """Return true if the object is a traceback.
183
184 Traceback objects provide these attributes:
185 tb_frame frame object at this level
186 tb_lasti index of last attempted instruction in bytecode
187 tb_lineno current line number in Python source code
188 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000189 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000190
191def isframe(object):
192 """Return true if the object is a frame object.
193
194 Frame objects provide these attributes:
195 f_back next outer frame object (this frame's caller)
196 f_builtins built-in namespace seen by this frame
197 f_code code object being executed in this frame
198 f_exc_traceback traceback if raised in this frame, or None
199 f_exc_type exception type if raised in this frame, or None
200 f_exc_value exception value if raised in this frame, or None
201 f_globals global namespace seen by this frame
202 f_lasti index of last attempted instruction in bytecode
203 f_lineno current line number in Python source code
204 f_locals local namespace seen by this frame
205 f_restricted 0 or 1 if frame is in restricted execution mode
206 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000207 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000208
209def iscode(object):
210 """Return true if the object is a code object.
211
212 Code objects provide these attributes:
213 co_argcount number of arguments (not including * or ** args)
214 co_code string of raw compiled bytecode
215 co_consts tuple of constants used in the bytecode
216 co_filename name of file in which this code object was created
217 co_firstlineno number of first line in Python source code
218 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
219 co_lnotab encoded mapping of line numbers to bytecode indices
220 co_name name with which this code object was defined
221 co_names tuple of names of local variables
222 co_nlocals number of local variables
223 co_stacksize virtual machine stack space required
224 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000225 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000226
227def isbuiltin(object):
228 """Return true if the object is a built-in function or method.
229
230 Built-in functions and methods provide these attributes:
231 __doc__ documentation string
232 __name__ original name of this function or method
233 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000234 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000235
236def isroutine(object):
237 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000238 return (isbuiltin(object)
239 or isfunction(object)
240 or ismethod(object)
241 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000242
Facundo Batista759bfc62008-02-18 03:43:43 +0000243def isgenerator(object):
244 """Return true if the object is a generator object."""
245 return isinstance(object, types.GeneratorType)
246
Christian Heimes608c1d82008-03-03 18:28:04 +0000247def isabstract(object):
248 """Return true if the object is an abstract base class (ABC)."""
Amaury Forgeot d'Arc24f3c5c2008-04-08 21:51:57 +0000249 return isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT
Christian Heimes608c1d82008-03-03 18:28:04 +0000250
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000251def getmembers(object, predicate=None):
252 """Return all members of an object as (name, value) pairs sorted by name.
253 Optionally, only return members that satisfy a given predicate."""
254 results = []
255 for key in dir(object):
Amaury Forgeot d'Arcb54447f2009-01-13 23:39:22 +0000256 try:
257 value = getattr(object, key)
258 except AttributeError:
259 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000260 if not predicate or predicate(value):
261 results.append((key, value))
262 results.sort()
263 return results
264
Raymond Hettingere896acc2008-01-11 03:04:50 +0000265Attribute = namedtuple('Attribute', 'name kind defining_class object')
266
Tim Peters13b49d32001-09-23 02:00:29 +0000267def classify_class_attrs(cls):
268 """Return list of attribute-descriptor tuples.
269
270 For each name in dir(cls), the return list contains a 4-tuple
271 with these elements:
272
273 0. The name (a string).
274
275 1. The kind of attribute this is, one of these strings:
276 'class method' created via classmethod()
277 'static method' created via staticmethod()
278 'property' created via property()
279 'method' any other flavor of method
280 'data' not a method
281
282 2. The class which defined this attribute (a class).
283
284 3. The object as obtained directly from the defining class's
285 __dict__, not via getattr. This is especially important for
286 data attributes: C.data is just a data object, but
287 C.__dict__['data'] may be a data descriptor with additional
288 info, like a __doc__ string.
289 """
290
291 mro = getmro(cls)
292 names = dir(cls)
293 result = []
294 for name in names:
295 # Get the object associated with the name.
296 # Getting an obj from the __dict__ sometimes reveals more than
297 # using getattr. Static and class methods are dramatic examples.
298 if name in cls.__dict__:
299 obj = cls.__dict__[name]
300 else:
301 obj = getattr(cls, name)
302
303 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000304 homecls = getattr(obj, "__objclass__", None)
305 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000306 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000307 for base in mro:
308 if name in base.__dict__:
309 homecls = base
310 break
311
312 # Get the object again, in order to get it from the defining
313 # __dict__ instead of via getattr (if possible).
314 if homecls is not None and name in homecls.__dict__:
315 obj = homecls.__dict__[name]
316
317 # Also get the object via getattr.
318 obj_via_getattr = getattr(cls, name)
319
320 # Classify the object.
321 if isinstance(obj, staticmethod):
322 kind = "static method"
323 elif isinstance(obj, classmethod):
324 kind = "class method"
325 elif isinstance(obj, property):
326 kind = "property"
327 elif (ismethod(obj_via_getattr) or
328 ismethoddescriptor(obj_via_getattr)):
329 kind = "method"
330 else:
331 kind = "data"
332
Raymond Hettingere896acc2008-01-11 03:04:50 +0000333 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000334
335 return result
336
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000337# ----------------------------------------------------------- class helpers
338def _searchbases(cls, accum):
339 # Simulate the "classic class" search order.
340 if cls in accum:
341 return
342 accum.append(cls)
343 for base in cls.__bases__:
344 _searchbases(base, accum)
345
346def getmro(cls):
347 "Return tuple of base classes (including cls) in method resolution order."
348 if hasattr(cls, "__mro__"):
349 return cls.__mro__
350 else:
351 result = []
352 _searchbases(cls, result)
353 return tuple(result)
354
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000355# -------------------------------------------------- source code extraction
356def indentsize(line):
357 """Return the indent size, in spaces, at the start of a line of text."""
358 expline = string.expandtabs(line)
359 return len(expline) - len(string.lstrip(expline))
360
361def getdoc(object):
362 """Get the documentation string for an object.
363
364 All tabs are expanded to spaces. To clean up docstrings that are
365 indented to line up with blocks of code, any whitespace than can be
366 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000367 try:
368 doc = object.__doc__
369 except AttributeError:
370 return None
Michael W. Hudson755f75e2002-05-20 17:29:46 +0000371 if not isinstance(doc, types.StringTypes):
Tim Peters24008312002-03-17 18:56:20 +0000372 return None
Georg Brandl7be19aa2008-06-07 15:59:10 +0000373 return cleandoc(doc)
374
375def cleandoc(doc):
376 """Clean up indentation from docstrings.
377
378 Any whitespace that can be uniformly removed from the second line
379 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000380 try:
381 lines = string.split(string.expandtabs(doc), '\n')
382 except UnicodeError:
383 return None
384 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000385 # Find minimum indentation of any non-blank lines after first line.
386 margin = sys.maxint
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000387 for line in lines[1:]:
388 content = len(string.lstrip(line))
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000389 if content:
390 indent = len(line) - content
391 margin = min(margin, indent)
392 # Remove indentation.
393 if lines:
394 lines[0] = lines[0].lstrip()
395 if margin < sys.maxint:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000396 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000397 # Remove any trailing or leading blank lines.
398 while lines and not lines[-1]:
399 lines.pop()
400 while lines and not lines[0]:
401 lines.pop(0)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000402 return string.join(lines, '\n')
403
404def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000405 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000406 if ismodule(object):
407 if hasattr(object, '__file__'):
408 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000409 raise TypeError('arg is a built-in module')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000410 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000411 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000412 if hasattr(object, '__file__'):
413 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000414 raise TypeError('arg is a built-in class')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000415 if ismethod(object):
416 object = object.im_func
417 if isfunction(object):
418 object = object.func_code
419 if istraceback(object):
420 object = object.tb_frame
421 if isframe(object):
422 object = object.f_code
423 if iscode(object):
424 return object.co_filename
Tim Peters478c1052003-06-29 05:46:54 +0000425 raise TypeError('arg is not a module, class, method, '
Jeremy Hyltonab919022003-06-27 18:41:20 +0000426 'function, traceback, frame, or code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000427
Raymond Hettingere896acc2008-01-11 03:04:50 +0000428ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
429
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000430def getmoduleinfo(path):
431 """Get the module name, suffix, mode, and module type for a given file."""
432 filename = os.path.basename(path)
Brett Cannonf5eb2ff2008-08-01 01:40:24 +0000433 suffixes = map(lambda info:
434 (-len(info[0]), info[0], info[1], info[2]),
435 imp.get_suffixes())
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000436 suffixes.sort() # try longest suffixes first, in case they overlap
437 for neglen, suffix, mode, mtype in suffixes:
438 if filename[neglen:] == suffix:
Raymond Hettingere896acc2008-01-11 03:04:50 +0000439 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000440
441def getmodulename(path):
442 """Return the module name for a given file, or None."""
443 info = getmoduleinfo(path)
444 if info: return info[0]
445
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000446def getsourcefile(object):
447 """Return the Python source file an object was defined in, if it exists."""
448 filename = getfile(object)
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000449 if string.lower(filename[-4:]) in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000450 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000451 for suffix, mode, kind in imp.get_suffixes():
452 if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
453 # Looks like a binary file. We want to only return a text file.
454 return None
Phillip J. Eby72ae6c82006-04-30 15:59:26 +0000455 if os.path.exists(filename):
456 return filename
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000457 # only return a non-existent filename if the module has a PEP 302 loader
458 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000459 return filename
460
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000461def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000462 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000463
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000464 The idea is for each object to have a unique origin, so this routine
465 normalizes the result as much as possible."""
Phillip J. Eby1a2959c2006-07-20 15:54:16 +0000466 if _filename is None:
467 _filename = getsourcefile(object) or getfile(object)
468 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000469
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000470modulesbyfile = {}
Nick Coghlanc495c662006-09-07 10:50:34 +0000471_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000472
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000473def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000474 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000475 if ismodule(object):
476 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000477 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000478 return sys.modules.get(object.__module__)
Nick Coghlanc495c662006-09-07 10:50:34 +0000479 # Try the filename to modulename cache
480 if _filename is not None and _filename in modulesbyfile:
481 return sys.modules.get(modulesbyfile[_filename])
482 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000483 try:
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000484 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000485 except TypeError:
486 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000487 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000488 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000489 # Update the filename to module name cache and check yet again
490 # Copy sys.modules in order to cope with changes while iterating
491 for modname, module in sys.modules.items():
Phillip J. Eby47032112006-04-11 01:07:43 +0000492 if ismodule(module) and hasattr(module, '__file__'):
Nick Coghlanc495c662006-09-07 10:50:34 +0000493 f = module.__file__
494 if f == _filesbymodname.get(modname, None):
495 # Have already mapped this module, so skip it
496 continue
497 _filesbymodname[modname] = f
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000498 f = getabsfile(module)
Nick Coghlanc495c662006-09-07 10:50:34 +0000499 # Always map to the name the module knows itself by
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000500 modulesbyfile[f] = modulesbyfile[
501 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000502 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000503 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000504 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000505 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000506 if not hasattr(object, '__name__'):
507 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000508 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000509 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000510 if mainobject is object:
511 return main
Nick Coghlanc495c662006-09-07 10:50:34 +0000512 # Check builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000513 builtin = sys.modules['__builtin__']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000514 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000515 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000516 if builtinobject is object:
517 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000518
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000519def findsource(object):
520 """Return the entire source file and starting line number for an object.
521
522 The argument may be a module, class, method, function, traceback, frame,
523 or code object. The source code is returned as a list of all the lines
524 in the file and the line number indexes a line in that list. An IOError
525 is raised if the source code cannot be retrieved."""
R. David Murray996ba022009-05-13 17:14:11 +0000526 file = getsourcefile(object)
527 if not file:
528 raise IOError('source code not available')
Nick Coghlanc495c662006-09-07 10:50:34 +0000529 module = getmodule(object, file)
Georg Brandl208badd2006-04-30 17:42:26 +0000530 if module:
531 lines = linecache.getlines(file, module.__dict__)
532 else:
533 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000534 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000535 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000536
537 if ismodule(object):
538 return lines, 0
539
540 if isclass(object):
541 name = object.__name__
Georg Brandlb2e81e32006-10-12 09:20:33 +0000542 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
543 # make some effort to find the best matching class definition:
544 # use the one with the least indentation, which is the one
545 # that's most probably not inside a function definition.
546 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000547 for i in range(len(lines)):
Georg Brandlb2e81e32006-10-12 09:20:33 +0000548 match = pat.match(lines[i])
549 if match:
550 # if it's at toplevel, it's already the best one
551 if lines[i][0] == 'c':
552 return lines, i
553 # else add whitespace to candidate list
554 candidates.append((match.group(1), i))
555 if candidates:
556 # this will sort by whitespace, and by line number,
557 # less whitespace first
558 candidates.sort()
559 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000560 else:
561 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000562
563 if ismethod(object):
564 object = object.im_func
565 if isfunction(object):
566 object = object.func_code
567 if istraceback(object):
568 object = object.tb_frame
569 if isframe(object):
570 object = object.f_code
571 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000572 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000573 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000574 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000575 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000576 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000577 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000578 lnum = lnum - 1
579 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000580 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000581
582def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000583 """Get lines of comments immediately preceding an object's source code.
584
585 Returns None when source can't be found.
586 """
587 try:
588 lines, lnum = findsource(object)
589 except (IOError, TypeError):
590 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000591
592 if ismodule(object):
593 # Look for a comment block at the top of the file.
594 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000595 if lines and lines[0][:2] == '#!': start = 1
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000596 while start < len(lines) and string.strip(lines[start]) in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000597 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000598 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000599 comments = []
600 end = start
601 while end < len(lines) and lines[end][:1] == '#':
602 comments.append(string.expandtabs(lines[end]))
603 end = end + 1
604 return string.join(comments, '')
605
606 # Look for a preceding block of comments at the same indentation.
607 elif lnum > 0:
608 indent = indentsize(lines[lnum])
609 end = lnum - 1
610 if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
611 indentsize(lines[end]) == indent:
612 comments = [string.lstrip(string.expandtabs(lines[end]))]
613 if end > 0:
614 end = end - 1
615 comment = string.lstrip(string.expandtabs(lines[end]))
616 while comment[:1] == '#' and indentsize(lines[end]) == indent:
617 comments[:0] = [comment]
618 end = end - 1
619 if end < 0: break
620 comment = string.lstrip(string.expandtabs(lines[end]))
621 while comments and string.strip(comments[0]) == '#':
622 comments[:1] = []
623 while comments and string.strip(comments[-1]) == '#':
624 comments[-1:] = []
625 return string.join(comments, '')
626
Tim Peters4efb6e92001-06-29 23:51:08 +0000627class EndOfBlock(Exception): pass
628
629class BlockFinder:
630 """Provide a tokeneater() method to detect the end of a code block."""
631 def __init__(self):
632 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000633 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000634 self.started = False
635 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000636 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000637
Brett Cannonf5eb2ff2008-08-01 01:40:24 +0000638 def tokeneater(self, type, token, srow_scol, erow_ecol, line):
639 srow, scol = srow_scol
640 erow, ecol = erow_ecol
Tim Peters4efb6e92001-06-29 23:51:08 +0000641 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000642 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000643 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000644 if token == "lambda":
645 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000646 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000647 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000648 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000649 self.passline = False # stop skipping when a NEWLINE is seen
Tim Peters4efb6e92001-06-29 23:51:08 +0000650 self.last = srow
Armin Rigodd5c0232005-09-25 11:45:45 +0000651 if self.islambda: # lambdas always end at the first NEWLINE
652 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000653 elif self.passline:
654 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000655 elif type == tokenize.INDENT:
656 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000657 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000658 elif type == tokenize.DEDENT:
659 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000660 # the end of matching indent/dedent pairs end a block
661 # (note that this only works for "def"/"class" blocks,
662 # not e.g. for "if: else:" or "try: finally:" blocks)
663 if self.indent <= 0:
664 raise EndOfBlock
665 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
666 # any other token on the same indentation level end the previous
667 # block as well, except the pseudo-tokens COMMENT and NL.
668 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000669
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000670def getblock(lines):
671 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000672 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000673 try:
Armin Rigodd5c0232005-09-25 11:45:45 +0000674 tokenize.tokenize(iter(lines).next, blockfinder.tokeneater)
675 except (EndOfBlock, IndentationError):
676 pass
677 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000678
679def getsourcelines(object):
680 """Return a list of source lines and starting line number for an object.
681
682 The argument may be a module, class, method, function, traceback, frame,
683 or code object. The source code is returned as a list of the lines
684 corresponding to the object and the line number indicates where in the
685 original source file the first line of code was found. An IOError is
686 raised if the source code cannot be retrieved."""
687 lines, lnum = findsource(object)
688
689 if ismodule(object): return lines, 0
690 else: return getblock(lines[lnum:]), lnum + 1
691
692def getsource(object):
693 """Return the text of the source code for an object.
694
695 The argument may be a module, class, method, function, traceback, frame,
696 or code object. The source code is returned as a single string. An
697 IOError is raised if the source code cannot be retrieved."""
698 lines, lnum = getsourcelines(object)
699 return string.join(lines, '')
700
701# --------------------------------------------------- class tree extraction
702def walktree(classes, children, parent):
703 """Recursive helper function for getclasstree()."""
704 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000705 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000706 for c in classes:
707 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000708 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000709 results.append(walktree(children[c], children, c))
710 return results
711
712def getclasstree(classes, unique=0):
713 """Arrange the given list of classes into a hierarchy of nested lists.
714
715 Where a nested list appears, it contains classes derived from the class
716 whose entry immediately precedes the list. Each entry is a 2-tuple
717 containing a class and a tuple of its base classes. If the 'unique'
718 argument is true, exactly one entry appears in the returned structure
719 for each class in the given list. Otherwise, classes using multiple
720 inheritance and their descendants will appear multiple times."""
721 children = {}
722 roots = []
723 for c in classes:
724 if c.__bases__:
725 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000726 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000727 children[parent] = []
728 children[parent].append(c)
729 if unique and parent in classes: break
730 elif c not in roots:
731 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000732 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000733 if parent not in classes:
734 roots.append(parent)
735 return walktree(roots, children, None)
736
737# ------------------------------------------------ argument list extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000738Arguments = namedtuple('Arguments', 'args varargs keywords')
739
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000740def getargs(co):
741 """Get information about the arguments accepted by a code object.
742
743 Three things are returned: (args, varargs, varkw), where 'args' is
744 a list of argument names (possibly containing nested lists), and
745 'varargs' and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000746
747 if not iscode(co):
748 raise TypeError('arg is not a code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000749
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000750 nargs = co.co_argcount
751 names = co.co_varnames
752 args = list(names[:nargs])
753 step = 0
754
755 # The following acrobatics are for anonymous (tuple) arguments.
756 for i in range(nargs):
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000757 if args[i][:1] in ('', '.'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000758 stack, remain, count = [], [], []
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000759 while step < len(co.co_code):
760 op = ord(co.co_code[step])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000761 step = step + 1
762 if op >= dis.HAVE_ARGUMENT:
763 opname = dis.opname[op]
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000764 value = ord(co.co_code[step]) + ord(co.co_code[step+1])*256
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000765 step = step + 2
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000766 if opname in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000767 remain.append(value)
768 count.append(value)
769 elif opname == 'STORE_FAST':
770 stack.append(names[value])
Matthias Klose2e829c02004-08-15 17:04:33 +0000771
772 # Special case for sublists of length 1: def foo((bar))
773 # doesn't generate the UNPACK_TUPLE bytecode, so if
774 # `remain` is empty here, we have such a sublist.
775 if not remain:
776 stack[0] = [stack[0]]
777 break
778 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000779 remain[-1] = remain[-1] - 1
Matthias Klose2e829c02004-08-15 17:04:33 +0000780 while remain[-1] == 0:
781 remain.pop()
782 size = count.pop()
783 stack[-size:] = [stack[-size:]]
784 if not remain: break
785 remain[-1] = remain[-1] - 1
786 if not remain: break
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000787 args[i] = stack[0]
788
789 varargs = None
790 if co.co_flags & CO_VARARGS:
791 varargs = co.co_varnames[nargs]
792 nargs = nargs + 1
793 varkw = None
794 if co.co_flags & CO_VARKEYWORDS:
795 varkw = co.co_varnames[nargs]
Raymond Hettingere896acc2008-01-11 03:04:50 +0000796 return Arguments(args, varargs, varkw)
797
798ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000799
800def getargspec(func):
801 """Get the names and default values of a function's arguments.
802
803 A tuple of four things is returned: (args, varargs, varkw, defaults).
804 'args' is a list of the argument names (it may contain nested lists).
805 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000806 'defaults' is an n-tuple of the default values of the last n arguments.
807 """
808
809 if ismethod(func):
810 func = func.im_func
811 if not isfunction(func):
812 raise TypeError('arg is not a Python function')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000813 args, varargs, varkw = getargs(func.func_code)
Raymond Hettingere896acc2008-01-11 03:04:50 +0000814 return ArgSpec(args, varargs, varkw, func.func_defaults)
815
816ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000817
818def getargvalues(frame):
819 """Get information about arguments passed into a particular frame.
820
821 A tuple of four things is returned: (args, varargs, varkw, locals).
822 'args' is a list of the argument names (it may contain nested lists).
823 'varargs' and 'varkw' are the names of the * and ** arguments or None.
824 'locals' is the locals dictionary of the given frame."""
825 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson4d9b0cd2008-10-21 22:18:29 +0000826 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000827
828def joinseq(seq):
829 if len(seq) == 1:
830 return '(' + seq[0] + ',)'
831 else:
832 return '(' + string.join(seq, ', ') + ')'
833
834def strseq(object, convert, join=joinseq):
835 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000836 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000837 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
838 else:
839 return convert(object)
840
841def formatargspec(args, varargs=None, varkw=None, defaults=None,
842 formatarg=str,
843 formatvarargs=lambda name: '*' + name,
844 formatvarkw=lambda name: '**' + name,
845 formatvalue=lambda value: '=' + repr(value),
846 join=joinseq):
847 """Format an argument spec from the 4 values returned by getargspec.
848
849 The first four arguments are (args, varargs, varkw, defaults). The
850 other four arguments are the corresponding optional formatting functions
851 that are called to turn names and values into strings. The ninth
852 argument is an optional function to format the sequence of arguments."""
853 specs = []
854 if defaults:
855 firstdefault = len(args) - len(defaults)
Benjamin Peterson9109f912009-01-17 04:28:57 +0000856 for i, arg in enumerate(args):
857 spec = strseq(arg, formatarg, join)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000858 if defaults and i >= firstdefault:
859 spec = spec + formatvalue(defaults[i - firstdefault])
860 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000861 if varargs is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000862 specs.append(formatvarargs(varargs))
Raymond Hettinger936654b2002-06-01 03:06:31 +0000863 if varkw is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000864 specs.append(formatvarkw(varkw))
865 return '(' + string.join(specs, ', ') + ')'
866
867def formatargvalues(args, varargs, varkw, locals,
868 formatarg=str,
869 formatvarargs=lambda name: '*' + name,
870 formatvarkw=lambda name: '**' + name,
871 formatvalue=lambda value: '=' + repr(value),
872 join=joinseq):
873 """Format an argument spec from the 4 values returned by getargvalues.
874
875 The first four arguments are (args, varargs, varkw, locals). The
876 next four arguments are the corresponding optional formatting functions
877 that are called to turn names and values into strings. The ninth
878 argument is an optional function to format the sequence of arguments."""
879 def convert(name, locals=locals,
880 formatarg=formatarg, formatvalue=formatvalue):
881 return formatarg(name) + formatvalue(locals[name])
882 specs = []
883 for i in range(len(args)):
884 specs.append(strseq(args[i], convert, join))
885 if varargs:
886 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
887 if varkw:
888 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
889 return '(' + string.join(specs, ', ') + ')'
890
891# -------------------------------------------------- stack frame extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000892
893Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
894
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000895def getframeinfo(frame, context=1):
896 """Get information about a frame or traceback object.
897
898 A tuple of five things is returned: the filename, the line number of
899 the current line, the function name, a list of lines of context from
900 the source code, and the index of the current line within that list.
901 The optional second argument specifies the number of lines of context
902 to return, which are centered around the current line."""
903 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000904 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000905 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000906 else:
907 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000908 if not isframe(frame):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000909 raise TypeError('arg is not a frame or traceback object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000910
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000911 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000912 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +0000913 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000914 try:
915 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000916 except IOError:
917 lines = index = None
918 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000919 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +0000920 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000921 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000922 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000923 else:
924 lines = index = None
925
Raymond Hettingere896acc2008-01-11 03:04:50 +0000926 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000927
928def getlineno(frame):
929 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000930 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
931 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000932
933def getouterframes(frame, context=1):
934 """Get a list of records for a frame and all higher (calling) frames.
935
936 Each record contains a frame object, filename, line number, function
937 name, a list of lines of context, and index within the context."""
938 framelist = []
939 while frame:
940 framelist.append((frame,) + getframeinfo(frame, context))
941 frame = frame.f_back
942 return framelist
943
944def getinnerframes(tb, context=1):
945 """Get a list of records for a traceback's frame and all lower frames.
946
947 Each record contains a frame object, filename, line number, function
948 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000949 framelist = []
950 while tb:
951 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
952 tb = tb.tb_next
953 return framelist
954
Jeremy Hyltonab919022003-06-27 18:41:20 +0000955currentframe = sys._getframe
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000956
957def stack(context=1):
958 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +0000959 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000960
961def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +0000962 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +0000963 return getinnerframes(sys.exc_info()[2], context)