blob: 074754fdfc241e869a607a114fc19b65149e5e6a [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
Christian Heimes25bb7832008-01-11 16:17:00 +000034from collections import namedtuple
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000035
36# ----------------------------------------------------------- type-checking
37def ismodule(object):
38 """Return true if the object is a module.
39
40 Module objects provide these attributes:
41 __doc__ documentation string
42 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000043 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000044
45def isclass(object):
46 """Return true if the object is a class.
47
48 Class objects provide these attributes:
49 __doc__ documentation string
50 __module__ name of module in which this class was defined"""
Guido van Rossum13257902007-06-07 23:15:56 +000051 return isinstance(object, type) or hasattr(object, '__bases__')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000052
53def ismethod(object):
54 """Return true if the object is an instance method.
55
56 Instance method objects provide these attributes:
57 __doc__ documentation string
58 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000059 __func__ function object containing implementation of method
60 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000061 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000062
Tim Peters536d2262001-09-20 05:13:38 +000063def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000064 """Return true if the object is a method descriptor.
65
66 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000067
68 This is new in Python 2.2, and, for example, is true of int.__add__.
69 An object passing this test has a __get__ attribute but not a __set__
70 attribute, but beyond that the set of attributes varies. __name__ is
71 usually sensible, and __doc__ often is.
72
Tim Petersf1d90b92001-09-20 05:47:55 +000073 Methods implemented via descriptors that also pass one of the other
74 tests return false from the ismethoddescriptor() test, simply because
75 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +000076 __func__ attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000077 return (hasattr(object, "__get__")
78 and not hasattr(object, "__set__") # else it's a data descriptor
79 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000080 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000081 and not isclass(object))
82
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000083def isdatadescriptor(object):
84 """Return true if the object is a data descriptor.
85
86 Data descriptors have both a __get__ and a __set__ attribute. Examples are
87 properties (defined in Python) and getsets and members (defined in C).
88 Typically, data descriptors will also have __name__ and __doc__ attributes
89 (properties, getsets, and members have both of these attributes), but this
90 is not guaranteed."""
91 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
92
Thomas Wouters0e3f5912006-08-11 14:57:12 +000093if hasattr(types, 'MemberDescriptorType'):
94 # CPython and equivalent
95 def ismemberdescriptor(object):
96 """Return true if the object is a member descriptor.
97
98 Member descriptors are specialized descriptors defined in extension
99 modules."""
100 return isinstance(object, types.MemberDescriptorType)
101else:
102 # Other implementations
103 def ismemberdescriptor(object):
104 """Return true if the object is a member descriptor.
105
106 Member descriptors are specialized descriptors defined in extension
107 modules."""
108 return False
109
110if hasattr(types, 'GetSetDescriptorType'):
111 # CPython and equivalent
112 def isgetsetdescriptor(object):
113 """Return true if the object is a getset descriptor.
114
115 getset descriptors are specialized descriptors defined in extension
116 modules."""
117 return isinstance(object, types.GetSetDescriptorType)
118else:
119 # Other implementations
120 def isgetsetdescriptor(object):
121 """Return true if the object is a getset descriptor.
122
123 getset descriptors are specialized descriptors defined in extension
124 modules."""
125 return False
126
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000127def isfunction(object):
128 """Return true if the object is a user-defined function.
129
130 Function objects provide these attributes:
131 __doc__ documentation string
132 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000133 __code__ code object containing compiled function bytecode
134 __defaults__ tuple of any default values for arguments
135 __globals__ global namespace in which this function was defined
136 __annotations__ dict of parameter annotations
137 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000138 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000139
140def istraceback(object):
141 """Return true if the object is a traceback.
142
143 Traceback objects provide these attributes:
144 tb_frame frame object at this level
145 tb_lasti index of last attempted instruction in bytecode
146 tb_lineno current line number in Python source code
147 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000148 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000149
150def isframe(object):
151 """Return true if the object is a frame object.
152
153 Frame objects provide these attributes:
154 f_back next outer frame object (this frame's caller)
155 f_builtins built-in namespace seen by this frame
156 f_code code object being executed in this frame
157 f_exc_traceback traceback if raised in this frame, or None
158 f_exc_type exception type if raised in this frame, or None
159 f_exc_value exception value if raised in this frame, or None
160 f_globals global namespace seen by this frame
161 f_lasti index of last attempted instruction in bytecode
162 f_lineno current line number in Python source code
163 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000164 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000165 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000166
167def iscode(object):
168 """Return true if the object is a code object.
169
170 Code objects provide these attributes:
171 co_argcount number of arguments (not including * or ** args)
172 co_code string of raw compiled bytecode
173 co_consts tuple of constants used in the bytecode
174 co_filename name of file in which this code object was created
175 co_firstlineno number of first line in Python source code
176 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
177 co_lnotab encoded mapping of line numbers to bytecode indices
178 co_name name with which this code object was defined
179 co_names tuple of names of local variables
180 co_nlocals number of local variables
181 co_stacksize virtual machine stack space required
182 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000183 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000184
185def isbuiltin(object):
186 """Return true if the object is a built-in function or method.
187
188 Built-in functions and methods provide these attributes:
189 __doc__ documentation string
190 __name__ original name of this function or method
191 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000192 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000193
194def isroutine(object):
195 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000196 return (isbuiltin(object)
197 or isfunction(object)
198 or ismethod(object)
199 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000200
201def getmembers(object, predicate=None):
202 """Return all members of an object as (name, value) pairs sorted by name.
203 Optionally, only return members that satisfy a given predicate."""
204 results = []
205 for key in dir(object):
206 value = getattr(object, key)
207 if not predicate or predicate(value):
208 results.append((key, value))
209 results.sort()
210 return results
211
Christian Heimes25bb7832008-01-11 16:17:00 +0000212Attribute = namedtuple('Attribute', 'name kind defining_class object')
213
Tim Peters13b49d32001-09-23 02:00:29 +0000214def classify_class_attrs(cls):
215 """Return list of attribute-descriptor tuples.
216
217 For each name in dir(cls), the return list contains a 4-tuple
218 with these elements:
219
220 0. The name (a string).
221
222 1. The kind of attribute this is, one of these strings:
223 'class method' created via classmethod()
224 'static method' created via staticmethod()
225 'property' created via property()
226 'method' any other flavor of method
227 'data' not a method
228
229 2. The class which defined this attribute (a class).
230
231 3. The object as obtained directly from the defining class's
232 __dict__, not via getattr. This is especially important for
233 data attributes: C.data is just a data object, but
234 C.__dict__['data'] may be a data descriptor with additional
235 info, like a __doc__ string.
236 """
237
238 mro = getmro(cls)
239 names = dir(cls)
240 result = []
241 for name in names:
242 # Get the object associated with the name.
243 # Getting an obj from the __dict__ sometimes reveals more than
244 # using getattr. Static and class methods are dramatic examples.
245 if name in cls.__dict__:
246 obj = cls.__dict__[name]
247 else:
248 obj = getattr(cls, name)
249
250 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000251 homecls = getattr(obj, "__objclass__", None)
252 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000253 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000254 for base in mro:
255 if name in base.__dict__:
256 homecls = base
257 break
258
259 # Get the object again, in order to get it from the defining
260 # __dict__ instead of via getattr (if possible).
261 if homecls is not None and name in homecls.__dict__:
262 obj = homecls.__dict__[name]
263
264 # Also get the object via getattr.
265 obj_via_getattr = getattr(cls, name)
266
267 # Classify the object.
268 if isinstance(obj, staticmethod):
269 kind = "static method"
270 elif isinstance(obj, classmethod):
271 kind = "class method"
272 elif isinstance(obj, property):
273 kind = "property"
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000274 elif (isfunction(obj_via_getattr) or
Tim Peters13b49d32001-09-23 02:00:29 +0000275 ismethoddescriptor(obj_via_getattr)):
276 kind = "method"
277 else:
278 kind = "data"
279
Christian Heimes25bb7832008-01-11 16:17:00 +0000280 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000281
282 return result
283
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000284# ----------------------------------------------------------- class helpers
285def _searchbases(cls, accum):
286 # Simulate the "classic class" search order.
287 if cls in accum:
288 return
289 accum.append(cls)
290 for base in cls.__bases__:
291 _searchbases(base, accum)
292
293def getmro(cls):
294 "Return tuple of base classes (including cls) in method resolution order."
295 if hasattr(cls, "__mro__"):
296 return cls.__mro__
297 else:
298 result = []
299 _searchbases(cls, result)
300 return tuple(result)
301
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000302# -------------------------------------------------- source code extraction
303def indentsize(line):
304 """Return the indent size, in spaces, at the start of a line of text."""
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000305 expline = line.expandtabs()
306 return len(expline) - len(expline.lstrip())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000307
308def getdoc(object):
309 """Get the documentation string for an object.
310
311 All tabs are expanded to spaces. To clean up docstrings that are
312 indented to line up with blocks of code, any whitespace than can be
313 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000314 try:
315 doc = object.__doc__
316 except AttributeError:
317 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000318 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000319 return None
320 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000321 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000322 except UnicodeError:
323 return None
324 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000325 # Find minimum indentation of any non-blank lines after first line.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000326 margin = sys.maxsize
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000327 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000328 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000329 if content:
330 indent = len(line) - content
331 margin = min(margin, indent)
332 # Remove indentation.
333 if lines:
334 lines[0] = lines[0].lstrip()
Christian Heimesa37d4c62007-12-04 23:02:19 +0000335 if margin < sys.maxsize:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000336 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000337 # Remove any trailing or leading blank lines.
338 while lines and not lines[-1]:
339 lines.pop()
340 while lines and not lines[0]:
341 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000342 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000343
344def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000345 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000346 if ismodule(object):
347 if hasattr(object, '__file__'):
348 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000349 raise TypeError('arg is a built-in module')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000350 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000351 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000352 if hasattr(object, '__file__'):
353 return object.__file__
Jeremy Hyltonab919022003-06-27 18:41:20 +0000354 raise TypeError('arg is a built-in class')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000355 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000356 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000357 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000358 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000359 if istraceback(object):
360 object = object.tb_frame
361 if isframe(object):
362 object = object.f_code
363 if iscode(object):
364 return object.co_filename
Tim Peters478c1052003-06-29 05:46:54 +0000365 raise TypeError('arg is not a module, class, method, '
Jeremy Hyltonab919022003-06-27 18:41:20 +0000366 'function, traceback, frame, or code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000367
Christian Heimes25bb7832008-01-11 16:17:00 +0000368ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
369
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000370def getmoduleinfo(path):
371 """Get the module name, suffix, mode, and module type for a given file."""
372 filename = os.path.basename(path)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000373 suffixes = [(-len(suffix), suffix, mode, mtype)
374 for suffix, mode, mtype in imp.get_suffixes()]
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000375 suffixes.sort() # try longest suffixes first, in case they overlap
376 for neglen, suffix, mode, mtype in suffixes:
377 if filename[neglen:] == suffix:
Christian Heimes25bb7832008-01-11 16:17:00 +0000378 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000379
380def getmodulename(path):
381 """Return the module name for a given file, or None."""
382 info = getmoduleinfo(path)
383 if info: return info[0]
384
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000385def getsourcefile(object):
386 """Return the Python source file an object was defined in, if it exists."""
387 filename = getfile(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000388 if filename[-4:].lower() in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000389 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000390 for suffix, mode, kind in imp.get_suffixes():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000391 if 'b' in mode and filename[-len(suffix):].lower() == suffix:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000392 # Looks like a binary file. We want to only return a text file.
393 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000394 if os.path.exists(filename):
395 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000396 # only return a non-existent filename if the module has a PEP 302 loader
397 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000398 return filename
399
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000401 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000402
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000403 The idea is for each object to have a unique origin, so this routine
404 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000405 if _filename is None:
406 _filename = getsourcefile(object) or getfile(object)
407 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000408
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000409modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000411
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000412def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000413 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000414 if ismodule(object):
415 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000416 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000417 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 # Try the filename to modulename cache
419 if _filename is not None and _filename in modulesbyfile:
420 return sys.modules.get(modulesbyfile[_filename])
421 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000422 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000423 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000424 except TypeError:
425 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000426 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000427 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000428 # Update the filename to module name cache and check yet again
429 # Copy sys.modules in order to cope with changes while iterating
430 for modname, module in sys.modules.items():
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000431 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000432 f = module.__file__
433 if f == _filesbymodname.get(modname, None):
434 # Have already mapped this module, so skip it
435 continue
436 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000437 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000438 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439 modulesbyfile[f] = modulesbyfile[
440 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000441 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000442 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000443 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000444 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000445 if not hasattr(object, '__name__'):
446 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000447 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000448 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000449 if mainobject is object:
450 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000451 # Check builtins
Georg Brandl1a3284e2007-12-02 09:40:06 +0000452 builtin = sys.modules['builtins']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000453 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000454 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000455 if builtinobject is object:
456 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000457
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000458def findsource(object):
459 """Return the entire source file and starting line number for an object.
460
461 The argument may be a module, class, method, function, traceback, frame,
462 or code object. The source code is returned as a list of all the lines
463 in the file and the line number indexes a line in that list. An IOError
464 is raised if the source code cannot be retrieved."""
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000465 file = getsourcefile(object) or getfile(object)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000466 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000467 if module:
468 lines = linecache.getlines(file, module.__dict__)
469 else:
470 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000471 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000472 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000473
474 if ismodule(object):
475 return lines, 0
476
477 if isclass(object):
478 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
480 # make some effort to find the best matching class definition:
481 # use the one with the least indentation, which is the one
482 # that's most probably not inside a function definition.
483 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000484 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000485 match = pat.match(lines[i])
486 if match:
487 # if it's at toplevel, it's already the best one
488 if lines[i][0] == 'c':
489 return lines, i
490 # else add whitespace to candidate list
491 candidates.append((match.group(1), i))
492 if candidates:
493 # this will sort by whitespace, and by line number,
494 # less whitespace first
495 candidates.sort()
496 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000497 else:
498 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000499
500 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000501 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000502 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000503 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000504 if istraceback(object):
505 object = object.tb_frame
506 if isframe(object):
507 object = object.f_code
508 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000509 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000510 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000511 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000512 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000513 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000514 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000515 lnum = lnum - 1
516 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000517 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000518
519def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000520 """Get lines of comments immediately preceding an object's source code.
521
522 Returns None when source can't be found.
523 """
524 try:
525 lines, lnum = findsource(object)
526 except (IOError, TypeError):
527 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000528
529 if ismodule(object):
530 # Look for a comment block at the top of the file.
531 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000532 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000533 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000534 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000535 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000536 comments = []
537 end = start
538 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000539 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000540 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000541 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000542
543 # Look for a preceding block of comments at the same indentation.
544 elif lnum > 0:
545 indent = indentsize(lines[lnum])
546 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000547 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000548 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000549 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000550 if end > 0:
551 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000552 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000553 while comment[:1] == '#' and indentsize(lines[end]) == indent:
554 comments[:0] = [comment]
555 end = end - 1
556 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000557 comment = lines[end].expandtabs().lstrip()
558 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000559 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000560 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000561 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000562 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000563
Tim Peters4efb6e92001-06-29 23:51:08 +0000564class EndOfBlock(Exception): pass
565
566class BlockFinder:
567 """Provide a tokeneater() method to detect the end of a code block."""
568 def __init__(self):
569 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000570 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000571 self.started = False
572 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000573 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000574
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000575 def tokeneater(self, type, token, srowcol, erowcol, line):
Tim Peters4efb6e92001-06-29 23:51:08 +0000576 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000577 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000578 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000579 if token == "lambda":
580 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000581 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000582 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000583 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000584 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000585 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000586 if self.islambda: # lambdas always end at the first NEWLINE
587 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000588 elif self.passline:
589 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000590 elif type == tokenize.INDENT:
591 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000592 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000593 elif type == tokenize.DEDENT:
594 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000595 # the end of matching indent/dedent pairs end a block
596 # (note that this only works for "def"/"class" blocks,
597 # not e.g. for "if: else:" or "try: finally:" blocks)
598 if self.indent <= 0:
599 raise EndOfBlock
600 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
601 # any other token on the same indentation level end the previous
602 # block as well, except the pseudo-tokens COMMENT and NL.
603 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000604
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000605def getblock(lines):
606 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000607 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000608 try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000609 tokenize.tokenize(iter(lines).__next__, blockfinder.tokeneater)
Armin Rigodd5c0232005-09-25 11:45:45 +0000610 except (EndOfBlock, IndentationError):
611 pass
612 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000613
614def getsourcelines(object):
615 """Return a list of source lines and starting line number for an object.
616
617 The argument may be a module, class, method, function, traceback, frame,
618 or code object. The source code is returned as a list of the lines
619 corresponding to the object and the line number indicates where in the
620 original source file the first line of code was found. An IOError is
621 raised if the source code cannot be retrieved."""
622 lines, lnum = findsource(object)
623
624 if ismodule(object): return lines, 0
625 else: return getblock(lines[lnum:]), lnum + 1
626
627def getsource(object):
628 """Return the text of the source code for an object.
629
630 The argument may be a module, class, method, function, traceback, frame,
631 or code object. The source code is returned as a single string. An
632 IOError is raised if the source code cannot be retrieved."""
633 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000634 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000635
636# --------------------------------------------------- class tree extraction
637def walktree(classes, children, parent):
638 """Recursive helper function for getclasstree()."""
639 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000640 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000641 for c in classes:
642 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000643 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000644 results.append(walktree(children[c], children, c))
645 return results
646
647def getclasstree(classes, unique=0):
648 """Arrange the given list of classes into a hierarchy of nested lists.
649
650 Where a nested list appears, it contains classes derived from the class
651 whose entry immediately precedes the list. Each entry is a 2-tuple
652 containing a class and a tuple of its base classes. If the 'unique'
653 argument is true, exactly one entry appears in the returned structure
654 for each class in the given list. Otherwise, classes using multiple
655 inheritance and their descendants will appear multiple times."""
656 children = {}
657 roots = []
658 for c in classes:
659 if c.__bases__:
660 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000661 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000662 children[parent] = []
663 children[parent].append(c)
664 if unique and parent in classes: break
665 elif c not in roots:
666 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000667 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000668 if parent not in classes:
669 roots.append(parent)
670 return walktree(roots, children, None)
671
672# ------------------------------------------------ argument list extraction
673# These constants are from Python's compile.h.
674CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8
675
Christian Heimes25bb7832008-01-11 16:17:00 +0000676Arguments = namedtuple('Arguments', 'args, varargs, varkw')
677
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000678def getargs(co):
679 """Get information about the arguments accepted by a code object.
680
Guido van Rossum2e65f892007-02-28 22:03:49 +0000681 Three things are returned: (args, varargs, varkw), where
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000682 'args' is the list of argument names, possibly containing nested
Guido van Rossum2e65f892007-02-28 22:03:49 +0000683 lists. Keyword-only arguments are appended. 'varargs' and 'varkw'
684 are the names of the * and ** arguments or None."""
685 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000686 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000687
688def _getfullargs(co):
689 """Get information about the arguments accepted by a code object.
690
691 Four things are returned: (args, varargs, kwonlyargs, varkw), where
692 'args' and 'kwonlyargs' are lists of argument names (with 'args'
693 possibly containing nested lists), and 'varargs' and 'varkw' are the
694 names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000695
696 if not iscode(co):
697 raise TypeError('arg is not a code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000698
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000699 nargs = co.co_argcount
700 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000701 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000702 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000703 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000704 step = 0
705
Guido van Rossum2e65f892007-02-28 22:03:49 +0000706 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000707 varargs = None
708 if co.co_flags & CO_VARARGS:
709 varargs = co.co_varnames[nargs]
710 nargs = nargs + 1
711 varkw = None
712 if co.co_flags & CO_VARKEYWORDS:
713 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000714 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000715
Christian Heimes25bb7832008-01-11 16:17:00 +0000716
717ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
718
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000719def getargspec(func):
720 """Get the names and default values of a function's arguments.
721
722 A tuple of four things is returned: (args, varargs, varkw, defaults).
723 'args' is a list of the argument names (it may contain nested lists).
Guido van Rossum2e65f892007-02-28 22:03:49 +0000724 'args' will include keyword-only argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000725 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000726 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000727
Guido van Rossum2e65f892007-02-28 22:03:49 +0000728 Use the getfullargspec() API for Python-3000 code, as annotations
729 and keyword arguments are supported. getargspec() will raise ValueError
730 if the func has either annotations or keyword arguments.
731 """
732
733 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
734 getfullargspec(func)
735 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000736 raise ValueError("Function has keyword-only arguments or annotations"
737 ", use getfullargspec() API which can support them")
Christian Heimes25bb7832008-01-11 16:17:00 +0000738 return ArgSpec(args, varargs, varkw, defaults)
739
740FullArgSpec = namedtuple('FullArgSpec',
741 'args, varargs, varkw, defaults, kwonlyargs, kwdefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000742
743def getfullargspec(func):
744 """Get the names and default values of a function's arguments.
745
Brett Cannon504d8852007-09-07 02:12:14 +0000746 A tuple of seven things is returned:
747 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Guido van Rossum2e65f892007-02-28 22:03:49 +0000748 'args' is a list of the argument names (it may contain nested lists).
749 'varargs' and 'varkw' are the names of the * and ** arguments or None.
750 'defaults' is an n-tuple of the default values of the last n arguments.
751 'kwonlyargs' is a list of keyword-only argument names.
752 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
753 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000754
Guido van Rossum2e65f892007-02-28 22:03:49 +0000755 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000756 """
757
758 if ismethod(func):
Christian Heimesff737952007-11-27 10:40:20 +0000759 func = func.__func__
Jeremy Hylton64967882003-06-27 18:14:39 +0000760 if not isfunction(func):
761 raise TypeError('arg is not a Python function')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000762 args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
Christian Heimes25bb7832008-01-11 16:17:00 +0000763 return FullArgSpec(args, varargs, varkw, func.__defaults__,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000764 kwonlyargs, func.__kwdefaults__, func.__annotations__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000765
Christian Heimes25bb7832008-01-11 16:17:00 +0000766ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
767
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000768def getargvalues(frame):
769 """Get information about arguments passed into a particular frame.
770
771 A tuple of four things is returned: (args, varargs, varkw, locals).
772 'args' is a list of the argument names (it may contain nested lists).
773 'varargs' and 'varkw' are the names of the * and ** arguments or None.
774 'locals' is the locals dictionary of the given frame."""
775 args, varargs, varkw = getargs(frame.f_code)
776 return args, varargs, varkw, frame.f_locals
777
778def joinseq(seq):
779 if len(seq) == 1:
780 return '(' + seq[0] + ',)'
781 else:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000782 return '(' + ', '.join(seq) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000783
784def strseq(object, convert, join=joinseq):
785 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000786 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000787 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
788 else:
789 return convert(object)
790
Guido van Rossum2e65f892007-02-28 22:03:49 +0000791def formatannotation(annotation, base_module=None):
792 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +0000793 if annotation.__module__ in ('builtins', base_module):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000794 return annotation.__name__
795 return annotation.__module__+'.'+annotation.__name__
796 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000797
Guido van Rossum2e65f892007-02-28 22:03:49 +0000798def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000799 module = getattr(object, '__module__', None)
800 def _formatannotation(annotation):
801 return formatannotation(annotation, module)
802 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +0000803
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000804def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000805 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000806 formatarg=str,
807 formatvarargs=lambda name: '*' + name,
808 formatvarkw=lambda name: '**' + name,
809 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +0000810 formatreturns=lambda text: ' -> ' + text,
811 formatannotation=formatannotation,
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000812 join=joinseq):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000813 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +0000814 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000815
Guido van Rossum2e65f892007-02-28 22:03:49 +0000816 The first seven arguments are (args, varargs, varkw, defaults,
817 kwonlyargs, kwonlydefaults, annotations). The other five arguments
818 are the corresponding optional formatting functions that are called to
819 turn names and values into strings. The last argument is an optional
820 function to format the sequence of arguments."""
821 def formatargandannotation(arg):
822 result = formatarg(arg)
823 if arg in annotations:
824 result += ': ' + formatannotation(annotations[arg])
825 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000826 specs = []
827 if defaults:
828 firstdefault = len(args) - len(defaults)
829 for i in range(len(args)):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000830 spec = strseq(args[i], formatargandannotation, join)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000831 if defaults and i >= firstdefault:
832 spec = spec + formatvalue(defaults[i - firstdefault])
833 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000834 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000835 specs.append(formatvarargs(formatargandannotation(varargs)))
836 else:
837 if kwonlyargs:
838 specs.append('*')
839 if kwonlyargs:
840 for kwonlyarg in kwonlyargs:
841 spec = formatargandannotation(kwonlyarg)
842 if kwonlyarg in kwonlydefaults:
843 spec += formatvalue(kwonlydefaults[kwonlyarg])
844 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000845 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000846 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000847 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +0000848 if 'return' in annotations:
849 result += formatreturns(formatannotation(annotations['return']))
850 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000851
852def formatargvalues(args, varargs, varkw, locals,
853 formatarg=str,
854 formatvarargs=lambda name: '*' + name,
855 formatvarkw=lambda name: '**' + name,
856 formatvalue=lambda value: '=' + repr(value),
857 join=joinseq):
858 """Format an argument spec from the 4 values returned by getargvalues.
859
860 The first four arguments are (args, varargs, varkw, locals). The
861 next four arguments are the corresponding optional formatting functions
862 that are called to turn names and values into strings. The ninth
863 argument is an optional function to format the sequence of arguments."""
864 def convert(name, locals=locals,
865 formatarg=formatarg, formatvalue=formatvalue):
866 return formatarg(name) + formatvalue(locals[name])
867 specs = []
868 for i in range(len(args)):
869 specs.append(strseq(args[i], convert, join))
870 if varargs:
871 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
872 if varkw:
873 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000874 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000875
876# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000877
878Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
879
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000880def getframeinfo(frame, context=1):
881 """Get information about a frame or traceback object.
882
883 A tuple of five things is returned: the filename, the line number of
884 the current line, the function name, a list of lines of context from
885 the source code, and the index of the current line within that list.
886 The optional second argument specifies the number of lines of context
887 to return, which are centered around the current line."""
888 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000889 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000890 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +0000891 else:
892 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000893 if not isframe(frame):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000894 raise TypeError('arg is not a frame or traceback object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000895
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000896 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000897 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +0000898 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000899 try:
900 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000901 except IOError:
902 lines = index = None
903 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000904 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +0000905 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000906 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000907 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000908 else:
909 lines = index = None
910
Christian Heimes25bb7832008-01-11 16:17:00 +0000911 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +0000912
913def getlineno(frame):
914 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000915 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
916 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000917
918def getouterframes(frame, context=1):
919 """Get a list of records for a frame and all higher (calling) frames.
920
921 Each record contains a frame object, filename, line number, function
922 name, a list of lines of context, and index within the context."""
923 framelist = []
924 while frame:
925 framelist.append((frame,) + getframeinfo(frame, context))
926 frame = frame.f_back
927 return framelist
928
929def getinnerframes(tb, context=1):
930 """Get a list of records for a traceback's frame and all lower frames.
931
932 Each record contains a frame object, filename, line number, function
933 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000934 framelist = []
935 while tb:
936 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
937 tb = tb.tb_next
938 return framelist
939
Jeremy Hyltonab919022003-06-27 18:41:20 +0000940currentframe = sys._getframe
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000941
942def stack(context=1):
943 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +0000944 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000945
946def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +0000947 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +0000948 return getinnerframes(sys.exc_info()[2], context)