blob: a1910e4ff960a165620647ae18cdc973c7d4a5e7 [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
Neal Norwitz221085d2007-02-25 20:55:47 +00005attributes (co_*, im_*, tb_*, etc.) in a friendlier fashion.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00006It also provides some help for examining source code and class layout.
7
8Here are some of the useful functions provided by this module:
9
10 ismodule(), isclass(), ismethod(), isfunction(), istraceback(),
11 isframe(), iscode(), isbuiltin(), isroutine() - check object types
12 getmembers() - get members of an object that satisfy a given condition
13
14 getfile(), getsourcefile(), getsource() - find an object's source code
15 getdoc(), getcomments() - get documentation on an object
16 getmodule() - determine the module that an object came from
17 getclasstree() - arrange classes so as to represent their hierarchy
18
19 getargspec(), getargvalues() - get info about function arguments
Guido van Rossum2e65f892007-02-28 22:03:49 +000020 getfullargspec() - same, with support for Python-3000 features
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000021 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
Neal Norwitz9d72bb42007-04-17 08:48:32 +000032import sys, os, types, re, dis, imp, tokenize, linecache
Raymond Hettingera1a992c2005-03-11 06:46:45 +000033from operator import attrgetter
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000034
35# ----------------------------------------------------------- type-checking
36def ismodule(object):
37 """Return true if the object is a module.
38
39 Module objects provide these attributes:
40 __doc__ documentation string
41 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000042 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000043
44def isclass(object):
45 """Return true if the object is a class.
46
47 Class objects provide these attributes:
48 __doc__ documentation string
49 __module__ name of module in which this class was defined"""
Guido van Rossum13257902007-06-07 23:15:56 +000050 return isinstance(object, type) or hasattr(object, '__bases__')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000051
52def ismethod(object):
53 """Return true if the object is an instance method.
54
55 Instance method objects provide these attributes:
56 __doc__ documentation string
57 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000058 __func__ function object containing implementation of method
59 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000060 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000061
Tim Peters536d2262001-09-20 05:13:38 +000062def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000063 """Return true if the object is a method descriptor.
64
65 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000066
67 This is new in Python 2.2, and, for example, is true of int.__add__.
68 An object passing this test has a __get__ attribute but not a __set__
69 attribute, but beyond that the set of attributes varies. __name__ is
70 usually sensible, and __doc__ often is.
71
Tim Petersf1d90b92001-09-20 05:47:55 +000072 Methods implemented via descriptors that also pass one of the other
73 tests return false from the ismethoddescriptor() test, simply because
74 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +000075 __func__ attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000076 return (hasattr(object, "__get__")
77 and not hasattr(object, "__set__") # else it's a data descriptor
78 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000079 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000080 and not isclass(object))
81
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000082def isdatadescriptor(object):
83 """Return true if the object is a data descriptor.
84
85 Data descriptors have both a __get__ and a __set__ attribute. Examples are
86 properties (defined in Python) and getsets and members (defined in C).
87 Typically, data descriptors will also have __name__ and __doc__ attributes
88 (properties, getsets, and members have both of these attributes), but this
89 is not guaranteed."""
90 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
91
Thomas Wouters0e3f5912006-08-11 14:57:12 +000092if hasattr(types, 'MemberDescriptorType'):
93 # CPython and equivalent
94 def ismemberdescriptor(object):
95 """Return true if the object is a member descriptor.
96
97 Member descriptors are specialized descriptors defined in extension
98 modules."""
99 return isinstance(object, types.MemberDescriptorType)
100else:
101 # Other implementations
102 def ismemberdescriptor(object):
103 """Return true if the object is a member descriptor.
104
105 Member descriptors are specialized descriptors defined in extension
106 modules."""
107 return False
108
109if hasattr(types, 'GetSetDescriptorType'):
110 # CPython and equivalent
111 def isgetsetdescriptor(object):
112 """Return true if the object is a getset descriptor.
113
114 getset descriptors are specialized descriptors defined in extension
115 modules."""
116 return isinstance(object, types.GetSetDescriptorType)
117else:
118 # Other implementations
119 def isgetsetdescriptor(object):
120 """Return true if the object is a getset descriptor.
121
122 getset descriptors are specialized descriptors defined in extension
123 modules."""
124 return False
125
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000126def isfunction(object):
127 """Return true if the object is a user-defined function.
128
129 Function objects provide these attributes:
130 __doc__ documentation string
131 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000132 __code__ code object containing compiled function bytecode
133 __defaults__ tuple of any default values for arguments
134 __globals__ global namespace in which this function was defined
135 __annotations__ dict of parameter annotations
136 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000137 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000138
139def istraceback(object):
140 """Return true if the object is a traceback.
141
142 Traceback objects provide these attributes:
143 tb_frame frame object at this level
144 tb_lasti index of last attempted instruction in bytecode
145 tb_lineno current line number in Python source code
146 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000147 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000148
149def isframe(object):
150 """Return true if the object is a frame object.
151
152 Frame objects provide these attributes:
153 f_back next outer frame object (this frame's caller)
154 f_builtins built-in namespace seen by this frame
155 f_code code object being executed in this frame
156 f_exc_traceback traceback if raised in this frame, or None
157 f_exc_type exception type if raised in this frame, or None
158 f_exc_value exception value if raised in this frame, or None
159 f_globals global namespace seen by this frame
160 f_lasti index of last attempted instruction in bytecode
161 f_lineno current line number in Python source code
162 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000163 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000164 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000165
166def iscode(object):
167 """Return true if the object is a code object.
168
169 Code objects provide these attributes:
170 co_argcount number of arguments (not including * or ** args)
171 co_code string of raw compiled bytecode
172 co_consts tuple of constants used in the bytecode
173 co_filename name of file in which this code object was created
174 co_firstlineno number of first line in Python source code
175 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
176 co_lnotab encoded mapping of line numbers to bytecode indices
177 co_name name with which this code object was defined
178 co_names tuple of names of local variables
179 co_nlocals number of local variables
180 co_stacksize virtual machine stack space required
181 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000182 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000183
184def isbuiltin(object):
185 """Return true if the object is a built-in function or method.
186
187 Built-in functions and methods provide these attributes:
188 __doc__ documentation string
189 __name__ original name of this function or method
190 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000191 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000192
193def isroutine(object):
194 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000195 return (isbuiltin(object)
196 or isfunction(object)
197 or ismethod(object)
198 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000199
200def getmembers(object, predicate=None):
201 """Return all members of an object as (name, value) pairs sorted by name.
202 Optionally, only return members that satisfy a given predicate."""
203 results = []
204 for key in dir(object):
205 value = getattr(object, key)
206 if not predicate or predicate(value):
207 results.append((key, value))
208 results.sort()
209 return results
210
Tim Peters13b49d32001-09-23 02:00:29 +0000211def classify_class_attrs(cls):
212 """Return list of attribute-descriptor tuples.
213
214 For each name in dir(cls), the return list contains a 4-tuple
215 with these elements:
216
217 0. The name (a string).
218
219 1. The kind of attribute this is, one of these strings:
220 'class method' created via classmethod()
221 'static method' created via staticmethod()
222 'property' created via property()
223 'method' any other flavor of method
224 'data' not a method
225
226 2. The class which defined this attribute (a class).
227
228 3. The object as obtained directly from the defining class's
229 __dict__, not via getattr. This is especially important for
230 data attributes: C.data is just a data object, but
231 C.__dict__['data'] may be a data descriptor with additional
232 info, like a __doc__ string.
233 """
234
235 mro = getmro(cls)
236 names = dir(cls)
237 result = []
238 for name in names:
239 # Get the object associated with the name.
240 # Getting an obj from the __dict__ sometimes reveals more than
241 # using getattr. Static and class methods are dramatic examples.
242 if name in cls.__dict__:
243 obj = cls.__dict__[name]
244 else:
245 obj = getattr(cls, name)
246
247 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000248 homecls = getattr(obj, "__objclass__", None)
249 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000250 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000251 for base in mro:
252 if name in base.__dict__:
253 homecls = base
254 break
255
256 # Get the object again, in order to get it from the defining
257 # __dict__ instead of via getattr (if possible).
258 if homecls is not None and name in homecls.__dict__:
259 obj = homecls.__dict__[name]
260
261 # Also get the object via getattr.
262 obj_via_getattr = getattr(cls, name)
263
264 # Classify the object.
265 if isinstance(obj, staticmethod):
266 kind = "static method"
267 elif isinstance(obj, classmethod):
268 kind = "class method"
269 elif isinstance(obj, property):
270 kind = "property"
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000271 elif (isfunction(obj_via_getattr) or
Tim Peters13b49d32001-09-23 02:00:29 +0000272 ismethoddescriptor(obj_via_getattr)):
273 kind = "method"
274 else:
275 kind = "data"
276
277 result.append((name, kind, homecls, obj))
278
279 return result
280
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000281# ----------------------------------------------------------- class helpers
282def _searchbases(cls, accum):
283 # Simulate the "classic class" search order.
284 if cls in accum:
285 return
286 accum.append(cls)
287 for base in cls.__bases__:
288 _searchbases(base, accum)
289
290def getmro(cls):
291 "Return tuple of base classes (including cls) in method resolution order."
292 if hasattr(cls, "__mro__"):
293 return cls.__mro__
294 else:
295 result = []
296 _searchbases(cls, result)
297 return tuple(result)
298
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000299# -------------------------------------------------- source code extraction
300def indentsize(line):
301 """Return the indent size, in spaces, at the start of a line of text."""
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000302 expline = line.expandtabs()
303 return len(expline) - len(expline.lstrip())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000304
305def getdoc(object):
306 """Get the documentation string for an object.
307
308 All tabs are expanded to spaces. To clean up docstrings that are
309 indented to line up with blocks of code, any whitespace than can be
310 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000311 try:
312 doc = object.__doc__
313 except AttributeError:
314 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000315 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000316 return None
317 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000318 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000319 except UnicodeError:
320 return None
321 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000322 # Find minimum indentation of any non-blank lines after first line.
323 margin = sys.maxint
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000324 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000325 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000326 if content:
327 indent = len(line) - content
328 margin = min(margin, indent)
329 # Remove indentation.
330 if lines:
331 lines[0] = lines[0].lstrip()
332 if margin < sys.maxint:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000333 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000334 # Remove any trailing or leading blank lines.
335 while lines and not lines[-1]:
336 lines.pop()
337 while lines and not lines[0]:
338 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000339 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000340
341def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000342 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000343 if ismodule(object):
344 if hasattr(object, '__file__'):
345 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000346 raise TypeError('arg is a built-in module')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000347 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000348 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000349 if hasattr(object, '__file__'):
350 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000351 raise TypeError('arg is a built-in class')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000352 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000353 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000354 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000355 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000356 if istraceback(object):
357 object = object.tb_frame
358 if isframe(object):
359 object = object.f_code
360 if iscode(object):
361 return object.co_filename
Tim Peters478c1052003-06-29 05:46:54 +0000362 raise TypeError('arg is not a module, class, method, '
Jeremy Hyltonab919022003-06-27 18:41:20 +0000363 'function, traceback, frame, or code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000364
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000365def getmoduleinfo(path):
366 """Get the module name, suffix, mode, and module type for a given file."""
367 filename = os.path.basename(path)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000368 suffixes = [(-len(suffix), suffix, mode, mtype)
369 for suffix, mode, mtype in imp.get_suffixes()]
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000370 suffixes.sort() # try longest suffixes first, in case they overlap
371 for neglen, suffix, mode, mtype in suffixes:
372 if filename[neglen:] == suffix:
373 return filename[:neglen], suffix, mode, mtype
374
375def getmodulename(path):
376 """Return the module name for a given file, or None."""
377 info = getmoduleinfo(path)
378 if info: return info[0]
379
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000380def getsourcefile(object):
381 """Return the Python source file an object was defined in, if it exists."""
382 filename = getfile(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000383 if filename[-4:].lower() in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000384 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000385 for suffix, mode, kind in imp.get_suffixes():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000386 if 'b' in mode and filename[-len(suffix):].lower() == suffix:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000387 # Looks like a binary file. We want to only return a text file.
388 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000389 if os.path.exists(filename):
390 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391 # only return a non-existent filename if the module has a PEP 302 loader
392 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000393 return filename
394
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000395def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000396 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000397
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000398 The idea is for each object to have a unique origin, so this routine
399 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400 if _filename is None:
401 _filename = getsourcefile(object) or getfile(object)
402 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000403
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000404modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000406
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000408 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000409 if ismodule(object):
410 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000411 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000412 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 # Try the filename to modulename cache
414 if _filename is not None and _filename in modulesbyfile:
415 return sys.modules.get(modulesbyfile[_filename])
416 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000417 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000418 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000419 except TypeError:
420 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000421 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000422 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 # Update the filename to module name cache and check yet again
424 # Copy sys.modules in order to cope with changes while iterating
425 for modname, module in sys.modules.items():
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000426 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427 f = module.__file__
428 if f == _filesbymodname.get(modname, None):
429 # Have already mapped this module, so skip it
430 continue
431 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000432 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434 modulesbyfile[f] = modulesbyfile[
435 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000436 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000437 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000438 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000439 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000440 if not hasattr(object, '__name__'):
441 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000442 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000443 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000444 if mainobject is object:
445 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000446 # Check builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000447 builtin = sys.modules['__builtin__']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000448 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000449 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000450 if builtinobject is object:
451 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000452
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000453def findsource(object):
454 """Return the entire source file and starting line number for an object.
455
456 The argument may be a module, class, method, function, traceback, frame,
457 or code object. The source code is returned as a list of all the lines
458 in the file and the line number indexes a line in that list. An IOError
459 is raised if the source code cannot be retrieved."""
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000460 file = getsourcefile(object) or getfile(object)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 if module:
463 lines = linecache.getlines(file, module.__dict__)
464 else:
465 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000466 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000467 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000468
469 if ismodule(object):
470 return lines, 0
471
472 if isclass(object):
473 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000474 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
475 # make some effort to find the best matching class definition:
476 # use the one with the least indentation, which is the one
477 # that's most probably not inside a function definition.
478 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000479 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000480 match = pat.match(lines[i])
481 if match:
482 # if it's at toplevel, it's already the best one
483 if lines[i][0] == 'c':
484 return lines, i
485 # else add whitespace to candidate list
486 candidates.append((match.group(1), i))
487 if candidates:
488 # this will sort by whitespace, and by line number,
489 # less whitespace first
490 candidates.sort()
491 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000492 else:
493 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000494
495 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000496 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000497 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000498 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000499 if istraceback(object):
500 object = object.tb_frame
501 if isframe(object):
502 object = object.f_code
503 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000504 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000505 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000506 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000507 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000508 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000509 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000510 lnum = lnum - 1
511 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000512 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000513
514def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000515 """Get lines of comments immediately preceding an object's source code.
516
517 Returns None when source can't be found.
518 """
519 try:
520 lines, lnum = findsource(object)
521 except (IOError, TypeError):
522 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000523
524 if ismodule(object):
525 # Look for a comment block at the top of the file.
526 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000527 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000528 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000529 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000530 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000531 comments = []
532 end = start
533 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000534 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000535 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000536 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000537
538 # Look for a preceding block of comments at the same indentation.
539 elif lnum > 0:
540 indent = indentsize(lines[lnum])
541 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000542 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000543 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000544 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000545 if end > 0:
546 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000547 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000548 while comment[:1] == '#' and indentsize(lines[end]) == indent:
549 comments[:0] = [comment]
550 end = end - 1
551 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000552 comment = lines[end].expandtabs().lstrip()
553 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000554 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000555 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000556 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000557 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000558
Tim Peters4efb6e92001-06-29 23:51:08 +0000559class EndOfBlock(Exception): pass
560
561class BlockFinder:
562 """Provide a tokeneater() method to detect the end of a code block."""
563 def __init__(self):
564 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000565 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000566 self.started = False
567 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000568 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000569
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000570 def tokeneater(self, type, token, srowcol, erowcol, line):
Tim Peters4efb6e92001-06-29 23:51:08 +0000571 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000572 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000573 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000574 if token == "lambda":
575 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000576 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000577 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000578 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000579 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000580 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000581 if self.islambda: # lambdas always end at the first NEWLINE
582 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000583 elif self.passline:
584 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000585 elif type == tokenize.INDENT:
586 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000587 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000588 elif type == tokenize.DEDENT:
589 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000590 # the end of matching indent/dedent pairs end a block
591 # (note that this only works for "def"/"class" blocks,
592 # not e.g. for "if: else:" or "try: finally:" blocks)
593 if self.indent <= 0:
594 raise EndOfBlock
595 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
596 # any other token on the same indentation level end the previous
597 # block as well, except the pseudo-tokens COMMENT and NL.
598 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000599
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000600def getblock(lines):
601 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000602 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000603 try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000604 tokenize.tokenize(iter(lines).__next__, blockfinder.tokeneater)
Armin Rigodd5c0232005-09-25 11:45:45 +0000605 except (EndOfBlock, IndentationError):
606 pass
607 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000608
609def getsourcelines(object):
610 """Return a list of source lines and starting line number for an object.
611
612 The argument may be a module, class, method, function, traceback, frame,
613 or code object. The source code is returned as a list of the lines
614 corresponding to the object and the line number indicates where in the
615 original source file the first line of code was found. An IOError is
616 raised if the source code cannot be retrieved."""
617 lines, lnum = findsource(object)
618
619 if ismodule(object): return lines, 0
620 else: return getblock(lines[lnum:]), lnum + 1
621
622def getsource(object):
623 """Return the text of the source code for an object.
624
625 The argument may be a module, class, method, function, traceback, frame,
626 or code object. The source code is returned as a single string. An
627 IOError is raised if the source code cannot be retrieved."""
628 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000629 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000630
631# --------------------------------------------------- class tree extraction
632def walktree(classes, children, parent):
633 """Recursive helper function for getclasstree()."""
634 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000635 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000636 for c in classes:
637 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000638 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000639 results.append(walktree(children[c], children, c))
640 return results
641
642def getclasstree(classes, unique=0):
643 """Arrange the given list of classes into a hierarchy of nested lists.
644
645 Where a nested list appears, it contains classes derived from the class
646 whose entry immediately precedes the list. Each entry is a 2-tuple
647 containing a class and a tuple of its base classes. If the 'unique'
648 argument is true, exactly one entry appears in the returned structure
649 for each class in the given list. Otherwise, classes using multiple
650 inheritance and their descendants will appear multiple times."""
651 children = {}
652 roots = []
653 for c in classes:
654 if c.__bases__:
655 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000656 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000657 children[parent] = []
658 children[parent].append(c)
659 if unique and parent in classes: break
660 elif c not in roots:
661 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000662 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000663 if parent not in classes:
664 roots.append(parent)
665 return walktree(roots, children, None)
666
667# ------------------------------------------------ argument list extraction
668# These constants are from Python's compile.h.
669CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8
670
671def getargs(co):
672 """Get information about the arguments accepted by a code object.
673
Guido van Rossum2e65f892007-02-28 22:03:49 +0000674 Three things are returned: (args, varargs, varkw), where
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000675 'args' is the list of argument names, possibly containing nested
Guido van Rossum2e65f892007-02-28 22:03:49 +0000676 lists. Keyword-only arguments are appended. 'varargs' and 'varkw'
677 are the names of the * and ** arguments or None."""
678 args, varargs, kwonlyargs, varkw = _getfullargs(co)
679 return args + kwonlyargs, varargs, varkw
680
681def _getfullargs(co):
682 """Get information about the arguments accepted by a code object.
683
684 Four things are returned: (args, varargs, kwonlyargs, varkw), where
685 'args' and 'kwonlyargs' are lists of argument names (with 'args'
686 possibly containing nested lists), and 'varargs' and 'varkw' are the
687 names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000688
689 if not iscode(co):
690 raise TypeError('arg is not a code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000691
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000692 nargs = co.co_argcount
693 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000694 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000695 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000696 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000697 step = 0
698
Guido van Rossum2e65f892007-02-28 22:03:49 +0000699 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000700 varargs = None
701 if co.co_flags & CO_VARARGS:
702 varargs = co.co_varnames[nargs]
703 nargs = nargs + 1
704 varkw = None
705 if co.co_flags & CO_VARKEYWORDS:
706 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000707 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000708
709def getargspec(func):
710 """Get the names and default values of a function's arguments.
711
712 A tuple of four things is returned: (args, varargs, varkw, defaults).
713 'args' is a list of the argument names (it may contain nested lists).
Guido van Rossum2e65f892007-02-28 22:03:49 +0000714 'args' will include keyword-only argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000715 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000716 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000717
Guido van Rossum2e65f892007-02-28 22:03:49 +0000718 Use the getfullargspec() API for Python-3000 code, as annotations
719 and keyword arguments are supported. getargspec() will raise ValueError
720 if the func has either annotations or keyword arguments.
721 """
722
723 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
724 getfullargspec(func)
725 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000726 raise ValueError("Function has keyword-only arguments or annotations"
727 ", use getfullargspec() API which can support them")
Guido van Rossum2e65f892007-02-28 22:03:49 +0000728 return (args, varargs, varkw, defaults)
729
730def getfullargspec(func):
731 """Get the names and default values of a function's arguments.
732
Brett Cannon504d8852007-09-07 02:12:14 +0000733 A tuple of seven things is returned:
734 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Guido van Rossum2e65f892007-02-28 22:03:49 +0000735 'args' is a list of the argument names (it may contain nested lists).
736 'varargs' and 'varkw' are the names of the * and ** arguments or None.
737 'defaults' is an n-tuple of the default values of the last n arguments.
738 'kwonlyargs' is a list of keyword-only argument names.
739 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
740 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000741
Guido van Rossum2e65f892007-02-28 22:03:49 +0000742 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000743 """
744
745 if ismethod(func):
Christian Heimesff737952007-11-27 10:40:20 +0000746 func = func.__func__
Jeremy Hylton64967882003-06-27 18:14:39 +0000747 if not isfunction(func):
748 raise TypeError('arg is not a Python function')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000749 args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000750 return (args, varargs, varkw, func.__defaults__,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000751 kwonlyargs, func.__kwdefaults__, func.__annotations__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000752
753def getargvalues(frame):
754 """Get information about arguments passed into a particular frame.
755
756 A tuple of four things is returned: (args, varargs, varkw, locals).
757 'args' is a list of the argument names (it may contain nested lists).
758 'varargs' and 'varkw' are the names of the * and ** arguments or None.
759 'locals' is the locals dictionary of the given frame."""
760 args, varargs, varkw = getargs(frame.f_code)
761 return args, varargs, varkw, frame.f_locals
762
763def joinseq(seq):
764 if len(seq) == 1:
765 return '(' + seq[0] + ',)'
766 else:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000767 return '(' + ', '.join(seq) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000768
769def strseq(object, convert, join=joinseq):
770 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000771 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000772 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
773 else:
774 return convert(object)
775
Guido van Rossum2e65f892007-02-28 22:03:49 +0000776def formatannotation(annotation, base_module=None):
777 if isinstance(annotation, type):
778 if annotation.__module__ in ('__builtin__', base_module):
779 return annotation.__name__
780 return annotation.__module__+'.'+annotation.__name__
781 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000782
Guido van Rossum2e65f892007-02-28 22:03:49 +0000783def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000784 module = getattr(object, '__module__', None)
785 def _formatannotation(annotation):
786 return formatannotation(annotation, module)
787 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +0000788
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000789def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000790 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000791 formatarg=str,
792 formatvarargs=lambda name: '*' + name,
793 formatvarkw=lambda name: '**' + name,
794 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +0000795 formatreturns=lambda text: ' -> ' + text,
796 formatannotation=formatannotation,
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000797 join=joinseq):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000798 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +0000799 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000800
Guido van Rossum2e65f892007-02-28 22:03:49 +0000801 The first seven arguments are (args, varargs, varkw, defaults,
802 kwonlyargs, kwonlydefaults, annotations). The other five arguments
803 are the corresponding optional formatting functions that are called to
804 turn names and values into strings. The last argument is an optional
805 function to format the sequence of arguments."""
806 def formatargandannotation(arg):
807 result = formatarg(arg)
808 if arg in annotations:
809 result += ': ' + formatannotation(annotations[arg])
810 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000811 specs = []
812 if defaults:
813 firstdefault = len(args) - len(defaults)
814 for i in range(len(args)):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000815 spec = strseq(args[i], formatargandannotation, join)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000816 if defaults and i >= firstdefault:
817 spec = spec + formatvalue(defaults[i - firstdefault])
818 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000819 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000820 specs.append(formatvarargs(formatargandannotation(varargs)))
821 else:
822 if kwonlyargs:
823 specs.append('*')
824 if kwonlyargs:
825 for kwonlyarg in kwonlyargs:
826 spec = formatargandannotation(kwonlyarg)
827 if kwonlyarg in kwonlydefaults:
828 spec += formatvalue(kwonlydefaults[kwonlyarg])
829 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000830 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000831 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000832 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +0000833 if 'return' in annotations:
834 result += formatreturns(formatannotation(annotations['return']))
835 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000836
837def formatargvalues(args, varargs, varkw, locals,
838 formatarg=str,
839 formatvarargs=lambda name: '*' + name,
840 formatvarkw=lambda name: '**' + name,
841 formatvalue=lambda value: '=' + repr(value),
842 join=joinseq):
843 """Format an argument spec from the 4 values returned by getargvalues.
844
845 The first four arguments are (args, varargs, varkw, locals). The
846 next four arguments are the corresponding optional formatting functions
847 that are called to turn names and values into strings. The ninth
848 argument is an optional function to format the sequence of arguments."""
849 def convert(name, locals=locals,
850 formatarg=formatarg, formatvalue=formatvalue):
851 return formatarg(name) + formatvalue(locals[name])
852 specs = []
853 for i in range(len(args)):
854 specs.append(strseq(args[i], convert, join))
855 if varargs:
856 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
857 if varkw:
858 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000859 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000860
861# -------------------------------------------------- stack frame extraction
862def getframeinfo(frame, context=1):
863 """Get information about a frame or traceback object.
864
865 A tuple of five things is returned: the filename, the line number of
866 the current line, the function name, a list of lines of context from
867 the source code, and the index of the current line within that list.
868 The optional second argument specifies the number of lines of context
869 to return, which are centered around the current line."""
870 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000871 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000872 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000873 else:
874 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000875 if not isframe(frame):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000876 raise TypeError('arg is not a frame or traceback object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000877
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000878 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000879 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +0000880 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000881 try:
882 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000883 except IOError:
884 lines = index = None
885 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000886 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +0000887 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000888 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000889 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000890 else:
891 lines = index = None
892
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000893 return (filename, lineno, frame.f_code.co_name, lines, index)
894
895def getlineno(frame):
896 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000897 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
898 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000899
900def getouterframes(frame, context=1):
901 """Get a list of records for a frame and all higher (calling) frames.
902
903 Each record contains a frame object, filename, line number, function
904 name, a list of lines of context, and index within the context."""
905 framelist = []
906 while frame:
907 framelist.append((frame,) + getframeinfo(frame, context))
908 frame = frame.f_back
909 return framelist
910
911def getinnerframes(tb, context=1):
912 """Get a list of records for a traceback's frame and all lower frames.
913
914 Each record contains a frame object, filename, line number, function
915 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000916 framelist = []
917 while tb:
918 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
919 tb = tb.tb_next
920 return framelist
921
Jeremy Hyltonab919022003-06-27 18:41:20 +0000922currentframe = sys._getframe
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000923
924def stack(context=1):
925 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +0000926 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000927
928def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +0000929 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +0000930 return getinnerframes(sys.exc_info()[2], context)