blob: f894da251aa645a4bd916f5a39eef5a09deeb6ab [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
Christian Heimes7131fd92008-02-19 14:21:46 +000010 ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
11 isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
12 isroutine() - check object types
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000013 getmembers() - get members of an object that satisfy a given condition
14
15 getfile(), getsourcefile(), getsource() - find an object's source code
16 getdoc(), getcomments() - get documentation on an object
17 getmodule() - determine the module that an object came from
18 getclasstree() - arrange classes so as to represent their hierarchy
19
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +000020 getargspec(), getargvalues(), getcallargs() - get info about function arguments
Guido van Rossum2e65f892007-02-28 22:03:49 +000021 getfullargspec() - same, with support for Python-3000 features
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000022 formatargspec(), formatargvalues() - format an argument spec
23 getouterframes(), getinnerframes() - get info about frames
24 currentframe() - get the current stack frame
25 stack(), trace() - get info about frames on the stack or in a traceback
26"""
27
28# This module is in the public domain. No warranties.
29
Ka-Ping Yee8b58b842001-03-01 13:56:16 +000030__author__ = 'Ka-Ping Yee <ping@lfw.org>'
31__date__ = '1 Jan 2001'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000032
Christian Heimes7131fd92008-02-19 14:21:46 +000033import sys
34import os
35import types
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +000036import itertools
Christian Heimes7131fd92008-02-19 14:21:46 +000037import string
38import re
Christian Heimes7131fd92008-02-19 14:21:46 +000039import imp
40import tokenize
41import linecache
Raymond Hettingera1a992c2005-03-11 06:46:45 +000042from operator import attrgetter
Christian Heimes25bb7832008-01-11 16:17:00 +000043from collections import namedtuple
Nick Coghlan09c81232010-08-17 10:18:16 +000044
45# Create constants for the compiler flags in Include/code.h
46# We try to get them from dis to avoid duplication, but fall
47# back to hardcording so the dependency is optional
48try:
49 from dis import COMPILER_FLAG_NAMES as _flag_names
50except ImportError:
51 CO_OPTIMIZED, CO_NEWLOCALS = 0x1, 0x2
52 CO_VARARGS, CO_VARKEYWORDS = 0x4, 0x8
53 CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
54else:
55 mod_dict = globals()
56 for k, v in _flag_names.items():
57 mod_dict["CO_" + v] = k
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000058
Christian Heimesbe5b30b2008-03-03 19:18:51 +000059# See Include/object.h
60TPFLAGS_IS_ABSTRACT = 1 << 20
61
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000062# ----------------------------------------------------------- type-checking
63def ismodule(object):
64 """Return true if the object is a module.
65
66 Module objects provide these attributes:
Barry Warsaw28a691b2010-04-17 00:19:56 +000067 __cached__ pathname to byte compiled file
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000068 __doc__ documentation string
69 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000070 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000071
72def isclass(object):
73 """Return true if the object is a class.
74
75 Class objects provide these attributes:
76 __doc__ documentation string
77 __module__ name of module in which this class was defined"""
Benjamin Petersonc4656002009-01-17 22:41:18 +000078 return isinstance(object, type)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000079
80def ismethod(object):
81 """Return true if the object is an instance method.
82
83 Instance method objects provide these attributes:
84 __doc__ documentation string
85 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000086 __func__ function object containing implementation of method
87 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000088 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000089
Tim Peters536d2262001-09-20 05:13:38 +000090def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000091 """Return true if the object is a method descriptor.
92
93 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000094
95 This is new in Python 2.2, and, for example, is true of int.__add__.
96 An object passing this test has a __get__ attribute but not a __set__
97 attribute, but beyond that the set of attributes varies. __name__ is
98 usually sensible, and __doc__ often is.
99
Tim Petersf1d90b92001-09-20 05:47:55 +0000100 Methods implemented via descriptors that also pass one of the other
101 tests return false from the ismethoddescriptor() test, simply because
102 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +0000103 __func__ attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +0000104 return (hasattr(object, "__get__")
105 and not hasattr(object, "__set__") # else it's a data descriptor
106 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +0000107 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +0000108 and not isclass(object))
109
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000110def isdatadescriptor(object):
111 """Return true if the object is a data descriptor.
112
113 Data descriptors have both a __get__ and a __set__ attribute. Examples are
114 properties (defined in Python) and getsets and members (defined in C).
115 Typically, data descriptors will also have __name__ and __doc__ attributes
116 (properties, getsets, and members have both of these attributes), but this
117 is not guaranteed."""
118 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
119
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000120if hasattr(types, 'MemberDescriptorType'):
121 # CPython and equivalent
122 def ismemberdescriptor(object):
123 """Return true if the object is a member descriptor.
124
125 Member descriptors are specialized descriptors defined in extension
126 modules."""
127 return isinstance(object, types.MemberDescriptorType)
128else:
129 # Other implementations
130 def ismemberdescriptor(object):
131 """Return true if the object is a member descriptor.
132
133 Member descriptors are specialized descriptors defined in extension
134 modules."""
135 return False
136
137if hasattr(types, 'GetSetDescriptorType'):
138 # CPython and equivalent
139 def isgetsetdescriptor(object):
140 """Return true if the object is a getset descriptor.
141
142 getset descriptors are specialized descriptors defined in extension
143 modules."""
144 return isinstance(object, types.GetSetDescriptorType)
145else:
146 # Other implementations
147 def isgetsetdescriptor(object):
148 """Return true if the object is a getset descriptor.
149
150 getset descriptors are specialized descriptors defined in extension
151 modules."""
152 return False
153
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000154def isfunction(object):
155 """Return true if the object is a user-defined function.
156
157 Function objects provide these attributes:
158 __doc__ documentation string
159 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000160 __code__ code object containing compiled function bytecode
161 __defaults__ tuple of any default values for arguments
162 __globals__ global namespace in which this function was defined
163 __annotations__ dict of parameter annotations
164 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000165 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000166
Christian Heimes7131fd92008-02-19 14:21:46 +0000167def isgeneratorfunction(object):
168 """Return true if the object is a user-defined generator function.
169
170 Generator function objects provides same attributes as functions.
171
Alexander Belopolsky977a6842010-08-16 20:17:07 +0000172 See help(isfunction) for attributes listing."""
Georg Brandlb1441c72009-01-03 22:33:39 +0000173 return bool((isfunction(object) or ismethod(object)) and
174 object.__code__.co_flags & CO_GENERATOR)
Christian Heimes7131fd92008-02-19 14:21:46 +0000175
176def isgenerator(object):
177 """Return true if the object is a generator.
178
179 Generator objects provide these attributes:
180 __iter__ defined to support interation over container
181 close raises a new GeneratorExit exception inside the
182 generator to terminate the iteration
183 gi_code code object
184 gi_frame frame object or possibly None once the generator has
185 been exhausted
186 gi_running set to 1 when generator is executing, 0 otherwise
187 next return the next item from the container
188 send resumes the generator and "sends" a value that becomes
189 the result of the current yield-expression
190 throw used to raise an exception inside the generator"""
191 return isinstance(object, types.GeneratorType)
192
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000193def istraceback(object):
194 """Return true if the object is a traceback.
195
196 Traceback objects provide these attributes:
197 tb_frame frame object at this level
198 tb_lasti index of last attempted instruction in bytecode
199 tb_lineno current line number in Python source code
200 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000201 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000202
203def isframe(object):
204 """Return true if the object is a frame object.
205
206 Frame objects provide these attributes:
207 f_back next outer frame object (this frame's caller)
208 f_builtins built-in namespace seen by this frame
209 f_code code object being executed in this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000210 f_globals global namespace seen by this frame
211 f_lasti index of last attempted instruction in bytecode
212 f_lineno current line number in Python source code
213 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000214 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000215 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000216
217def iscode(object):
218 """Return true if the object is a code object.
219
220 Code objects provide these attributes:
221 co_argcount number of arguments (not including * or ** args)
222 co_code string of raw compiled bytecode
223 co_consts tuple of constants used in the bytecode
224 co_filename name of file in which this code object was created
225 co_firstlineno number of first line in Python source code
226 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
227 co_lnotab encoded mapping of line numbers to bytecode indices
228 co_name name with which this code object was defined
229 co_names tuple of names of local variables
230 co_nlocals number of local variables
231 co_stacksize virtual machine stack space required
232 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000233 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000234
235def isbuiltin(object):
236 """Return true if the object is a built-in function or method.
237
238 Built-in functions and methods provide these attributes:
239 __doc__ documentation string
240 __name__ original name of this function or method
241 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000242 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000243
244def isroutine(object):
245 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000246 return (isbuiltin(object)
247 or isfunction(object)
248 or ismethod(object)
249 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000250
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000251def isabstract(object):
252 """Return true if the object is an abstract base class (ABC)."""
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000253 return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT)
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000254
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000255def getmembers(object, predicate=None):
256 """Return all members of an object as (name, value) pairs sorted by name.
257 Optionally, only return members that satisfy a given predicate."""
258 results = []
259 for key in dir(object):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000260 try:
261 value = getattr(object, key)
262 except AttributeError:
263 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000264 if not predicate or predicate(value):
265 results.append((key, value))
266 results.sort()
267 return results
268
Christian Heimes25bb7832008-01-11 16:17:00 +0000269Attribute = namedtuple('Attribute', 'name kind defining_class object')
270
Tim Peters13b49d32001-09-23 02:00:29 +0000271def classify_class_attrs(cls):
272 """Return list of attribute-descriptor tuples.
273
274 For each name in dir(cls), the return list contains a 4-tuple
275 with these elements:
276
277 0. The name (a string).
278
279 1. The kind of attribute this is, one of these strings:
280 'class method' created via classmethod()
281 'static method' created via staticmethod()
282 'property' created via property()
283 'method' any other flavor of method
284 'data' not a method
285
286 2. The class which defined this attribute (a class).
287
288 3. The object as obtained directly from the defining class's
289 __dict__, not via getattr. This is especially important for
290 data attributes: C.data is just a data object, but
291 C.__dict__['data'] may be a data descriptor with additional
292 info, like a __doc__ string.
293 """
294
295 mro = getmro(cls)
296 names = dir(cls)
297 result = []
298 for name in names:
299 # Get the object associated with the name.
300 # Getting an obj from the __dict__ sometimes reveals more than
301 # using getattr. Static and class methods are dramatic examples.
302 if name in cls.__dict__:
303 obj = cls.__dict__[name]
304 else:
305 obj = getattr(cls, name)
306
307 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000308 homecls = getattr(obj, "__objclass__", None)
309 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000310 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000311 for base in mro:
312 if name in base.__dict__:
313 homecls = base
314 break
315
316 # Get the object again, in order to get it from the defining
317 # __dict__ instead of via getattr (if possible).
318 if homecls is not None and name in homecls.__dict__:
319 obj = homecls.__dict__[name]
320
321 # Also get the object via getattr.
322 obj_via_getattr = getattr(cls, name)
323
324 # Classify the object.
325 if isinstance(obj, staticmethod):
326 kind = "static method"
327 elif isinstance(obj, classmethod):
328 kind = "class method"
329 elif isinstance(obj, property):
330 kind = "property"
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000331 elif (isfunction(obj_via_getattr) or
Tim Peters13b49d32001-09-23 02:00:29 +0000332 ismethoddescriptor(obj_via_getattr)):
333 kind = "method"
334 else:
335 kind = "data"
336
Christian Heimes25bb7832008-01-11 16:17:00 +0000337 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000338
339 return result
340
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000341# ----------------------------------------------------------- class helpers
342def _searchbases(cls, accum):
343 # Simulate the "classic class" search order.
344 if cls in accum:
345 return
346 accum.append(cls)
347 for base in cls.__bases__:
348 _searchbases(base, accum)
349
350def getmro(cls):
351 "Return tuple of base classes (including cls) in method resolution order."
352 if hasattr(cls, "__mro__"):
353 return cls.__mro__
354 else:
355 result = []
356 _searchbases(cls, result)
357 return tuple(result)
358
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000359# -------------------------------------------------- source code extraction
360def indentsize(line):
361 """Return the indent size, in spaces, at the start of a line of text."""
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000362 expline = line.expandtabs()
363 return len(expline) - len(expline.lstrip())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000364
365def getdoc(object):
366 """Get the documentation string for an object.
367
368 All tabs are expanded to spaces. To clean up docstrings that are
369 indented to line up with blocks of code, any whitespace than can be
370 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000371 try:
372 doc = object.__doc__
373 except AttributeError:
374 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000375 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000376 return None
Georg Brandl0c77a822008-06-10 16:37:50 +0000377 return cleandoc(doc)
378
379def cleandoc(doc):
380 """Clean up indentation from docstrings.
381
382 Any whitespace that can be uniformly removed from the second line
383 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000384 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000385 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000386 except UnicodeError:
387 return None
388 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000389 # Find minimum indentation of any non-blank lines after first line.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000390 margin = sys.maxsize
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000391 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000392 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000393 if content:
394 indent = len(line) - content
395 margin = min(margin, indent)
396 # Remove indentation.
397 if lines:
398 lines[0] = lines[0].lstrip()
Christian Heimesa37d4c62007-12-04 23:02:19 +0000399 if margin < sys.maxsize:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000400 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000401 # Remove any trailing or leading blank lines.
402 while lines and not lines[-1]:
403 lines.pop()
404 while lines and not lines[0]:
405 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000406 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000407
408def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000409 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000410 if ismodule(object):
411 if hasattr(object, '__file__'):
412 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000413 raise TypeError('{!r} is a built-in module'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000414 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000415 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000416 if hasattr(object, '__file__'):
417 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000418 raise TypeError('{!r} is a built-in class'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000419 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000420 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000421 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000422 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000423 if istraceback(object):
424 object = object.tb_frame
425 if isframe(object):
426 object = object.f_code
427 if iscode(object):
428 return object.co_filename
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000429 raise TypeError('{!r} is not a module, class, method, '
430 'function, traceback, frame, or code object'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000431
Christian Heimes25bb7832008-01-11 16:17:00 +0000432ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
433
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000434def getmoduleinfo(path):
435 """Get the module name, suffix, mode, and module type for a given file."""
436 filename = os.path.basename(path)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000437 suffixes = [(-len(suffix), suffix, mode, mtype)
438 for suffix, mode, mtype in imp.get_suffixes()]
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000439 suffixes.sort() # try longest suffixes first, in case they overlap
440 for neglen, suffix, mode, mtype in suffixes:
441 if filename[neglen:] == suffix:
Christian Heimes25bb7832008-01-11 16:17:00 +0000442 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000443
444def getmodulename(path):
445 """Return the module name for a given file, or None."""
446 info = getmoduleinfo(path)
447 if info: return info[0]
448
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000449def getsourcefile(object):
R. David Murraya1b37402010-06-17 02:04:29 +0000450 """Return the filename that can be used to locate an object's source.
451 Return None if no way can be identified to get the source.
452 """
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000453 filename = getfile(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000454 if filename[-4:].lower() in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000455 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000456 for suffix, mode, kind in imp.get_suffixes():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000457 if 'b' in mode and filename[-len(suffix):].lower() == suffix:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000458 # Looks like a binary file. We want to only return a text file.
459 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460 if os.path.exists(filename):
461 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462 # only return a non-existent filename if the module has a PEP 302 loader
463 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000464 return filename
R. David Murraya1b37402010-06-17 02:04:29 +0000465 # or it is in the linecache
466 if filename in linecache.cache:
467 return filename
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000468
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000469def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000470 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000471
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000472 The idea is for each object to have a unique origin, so this routine
473 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000474 if _filename is None:
475 _filename = getsourcefile(object) or getfile(object)
476 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000477
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000478modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000480
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000481def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000482 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000483 if ismodule(object):
484 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000485 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000486 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487 # Try the filename to modulename cache
488 if _filename is not None and _filename in modulesbyfile:
489 return sys.modules.get(modulesbyfile[_filename])
490 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000491 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000492 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000493 except TypeError:
494 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000495 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000496 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 # Update the filename to module name cache and check yet again
498 # Copy sys.modules in order to cope with changes while iterating
499 for modname, module in sys.modules.items():
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000500 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000501 f = module.__file__
502 if f == _filesbymodname.get(modname, None):
503 # Have already mapped this module, so skip it
504 continue
505 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000506 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000508 modulesbyfile[f] = modulesbyfile[
509 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000510 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000511 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000512 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000513 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000514 if not hasattr(object, '__name__'):
515 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000516 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000517 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000518 if mainobject is object:
519 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 # Check builtins
Georg Brandl1a3284e2007-12-02 09:40:06 +0000521 builtin = sys.modules['builtins']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000522 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000523 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000524 if builtinobject is object:
525 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000526
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000527def findsource(object):
528 """Return the entire source file and starting line number for an object.
529
530 The argument may be a module, class, method, function, traceback, frame,
531 or code object. The source code is returned as a list of all the lines
532 in the file and the line number indexes a line in that list. An IOError
533 is raised if the source code cannot be retrieved."""
R. David Murray74b89242009-05-13 17:33:03 +0000534 file = getsourcefile(object)
535 if not file:
536 raise IOError('source code not available')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000537 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000538 if module:
539 lines = linecache.getlines(file, module.__dict__)
540 else:
541 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000542 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000543 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000544
545 if ismodule(object):
546 return lines, 0
547
548 if isclass(object):
549 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000550 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
551 # make some effort to find the best matching class definition:
552 # use the one with the least indentation, which is the one
553 # that's most probably not inside a function definition.
554 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000555 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000556 match = pat.match(lines[i])
557 if match:
558 # if it's at toplevel, it's already the best one
559 if lines[i][0] == 'c':
560 return lines, i
561 # else add whitespace to candidate list
562 candidates.append((match.group(1), i))
563 if candidates:
564 # this will sort by whitespace, and by line number,
565 # less whitespace first
566 candidates.sort()
567 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000568 else:
569 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000570
571 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000572 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000573 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000574 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000575 if istraceback(object):
576 object = object.tb_frame
577 if isframe(object):
578 object = object.f_code
579 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000580 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000581 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000582 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000583 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000584 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000585 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000586 lnum = lnum - 1
587 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000588 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000589
590def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000591 """Get lines of comments immediately preceding an object's source code.
592
593 Returns None when source can't be found.
594 """
595 try:
596 lines, lnum = findsource(object)
597 except (IOError, TypeError):
598 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000599
600 if ismodule(object):
601 # Look for a comment block at the top of the file.
602 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000603 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000604 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000605 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000606 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000607 comments = []
608 end = start
609 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000610 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000611 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000612 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000613
614 # Look for a preceding block of comments at the same indentation.
615 elif lnum > 0:
616 indent = indentsize(lines[lnum])
617 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000618 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000619 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000620 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000621 if end > 0:
622 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000623 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000624 while comment[:1] == '#' and indentsize(lines[end]) == indent:
625 comments[:0] = [comment]
626 end = end - 1
627 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000628 comment = lines[end].expandtabs().lstrip()
629 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000630 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000631 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000632 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000633 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000634
Tim Peters4efb6e92001-06-29 23:51:08 +0000635class EndOfBlock(Exception): pass
636
637class BlockFinder:
638 """Provide a tokeneater() method to detect the end of a code block."""
639 def __init__(self):
640 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000641 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000642 self.started = False
643 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000644 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000645
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000646 def tokeneater(self, type, token, srowcol, erowcol, line):
Tim Peters4efb6e92001-06-29 23:51:08 +0000647 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000648 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000649 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000650 if token == "lambda":
651 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000652 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000653 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000654 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000655 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000656 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000657 if self.islambda: # lambdas always end at the first NEWLINE
658 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000659 elif self.passline:
660 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000661 elif type == tokenize.INDENT:
662 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000663 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000664 elif type == tokenize.DEDENT:
665 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000666 # the end of matching indent/dedent pairs end a block
667 # (note that this only works for "def"/"class" blocks,
668 # not e.g. for "if: else:" or "try: finally:" blocks)
669 if self.indent <= 0:
670 raise EndOfBlock
671 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
672 # any other token on the same indentation level end the previous
673 # block as well, except the pseudo-tokens COMMENT and NL.
674 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000675
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000676def getblock(lines):
677 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000678 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000679 try:
Trent Nelson428de652008-03-18 22:41:35 +0000680 tokens = tokenize.generate_tokens(iter(lines).__next__)
681 for _token in tokens:
682 blockfinder.tokeneater(*_token)
Armin Rigodd5c0232005-09-25 11:45:45 +0000683 except (EndOfBlock, IndentationError):
684 pass
685 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000686
687def getsourcelines(object):
688 """Return a list of source lines and starting line number for an object.
689
690 The argument may be a module, class, method, function, traceback, frame,
691 or code object. The source code is returned as a list of the lines
692 corresponding to the object and the line number indicates where in the
693 original source file the first line of code was found. An IOError is
694 raised if the source code cannot be retrieved."""
695 lines, lnum = findsource(object)
696
697 if ismodule(object): return lines, 0
698 else: return getblock(lines[lnum:]), lnum + 1
699
700def getsource(object):
701 """Return the text of the source code for an object.
702
703 The argument may be a module, class, method, function, traceback, frame,
704 or code object. The source code is returned as a single string. An
705 IOError is raised if the source code cannot be retrieved."""
706 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000707 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000708
709# --------------------------------------------------- class tree extraction
710def walktree(classes, children, parent):
711 """Recursive helper function for getclasstree()."""
712 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000713 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000714 for c in classes:
715 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000716 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000717 results.append(walktree(children[c], children, c))
718 return results
719
Georg Brandl5ce83a02009-06-01 17:23:51 +0000720def getclasstree(classes, unique=False):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000721 """Arrange the given list of classes into a hierarchy of nested lists.
722
723 Where a nested list appears, it contains classes derived from the class
724 whose entry immediately precedes the list. Each entry is a 2-tuple
725 containing a class and a tuple of its base classes. If the 'unique'
726 argument is true, exactly one entry appears in the returned structure
727 for each class in the given list. Otherwise, classes using multiple
728 inheritance and their descendants will appear multiple times."""
729 children = {}
730 roots = []
731 for c in classes:
732 if c.__bases__:
733 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000734 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000735 children[parent] = []
736 children[parent].append(c)
737 if unique and parent in classes: break
738 elif c not in roots:
739 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000740 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000741 if parent not in classes:
742 roots.append(parent)
743 return walktree(roots, children, None)
744
745# ------------------------------------------------ argument list extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000746Arguments = namedtuple('Arguments', 'args, varargs, varkw')
747
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000748def getargs(co):
749 """Get information about the arguments accepted by a code object.
750
Guido van Rossum2e65f892007-02-28 22:03:49 +0000751 Three things are returned: (args, varargs, varkw), where
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000752 'args' is the list of argument names, possibly containing nested
Guido van Rossum2e65f892007-02-28 22:03:49 +0000753 lists. Keyword-only arguments are appended. 'varargs' and 'varkw'
754 are the names of the * and ** arguments or None."""
755 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000756 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000757
758def _getfullargs(co):
759 """Get information about the arguments accepted by a code object.
760
761 Four things are returned: (args, varargs, kwonlyargs, varkw), where
762 'args' and 'kwonlyargs' are lists of argument names (with 'args'
763 possibly containing nested lists), and 'varargs' and 'varkw' are the
764 names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000765
766 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000767 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000768
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000769 nargs = co.co_argcount
770 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000771 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000772 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000773 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000774 step = 0
775
Guido van Rossum2e65f892007-02-28 22:03:49 +0000776 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000777 varargs = None
778 if co.co_flags & CO_VARARGS:
779 varargs = co.co_varnames[nargs]
780 nargs = nargs + 1
781 varkw = None
782 if co.co_flags & CO_VARKEYWORDS:
783 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000784 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000785
Christian Heimes25bb7832008-01-11 16:17:00 +0000786
787ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
788
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000789def getargspec(func):
790 """Get the names and default values of a function's arguments.
791
792 A tuple of four things is returned: (args, varargs, varkw, defaults).
793 'args' is a list of the argument names (it may contain nested lists).
Guido van Rossum2e65f892007-02-28 22:03:49 +0000794 'args' will include keyword-only argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000795 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000796 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000797
Guido van Rossum2e65f892007-02-28 22:03:49 +0000798 Use the getfullargspec() API for Python-3000 code, as annotations
799 and keyword arguments are supported. getargspec() will raise ValueError
800 if the func has either annotations or keyword arguments.
801 """
802
803 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
804 getfullargspec(func)
805 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000806 raise ValueError("Function has keyword-only arguments or annotations"
807 ", use getfullargspec() API which can support them")
Christian Heimes25bb7832008-01-11 16:17:00 +0000808 return ArgSpec(args, varargs, varkw, defaults)
809
810FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +0000811 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000812
813def getfullargspec(func):
814 """Get the names and default values of a function's arguments.
815
Brett Cannon504d8852007-09-07 02:12:14 +0000816 A tuple of seven things is returned:
817 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Guido van Rossum2e65f892007-02-28 22:03:49 +0000818 'args' is a list of the argument names (it may contain nested lists).
819 'varargs' and 'varkw' are the names of the * and ** arguments or None.
820 'defaults' is an n-tuple of the default values of the last n arguments.
821 'kwonlyargs' is a list of keyword-only argument names.
822 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
823 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000824
Guido van Rossum2e65f892007-02-28 22:03:49 +0000825 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000826 """
827
828 if ismethod(func):
Christian Heimesff737952007-11-27 10:40:20 +0000829 func = func.__func__
Jeremy Hylton64967882003-06-27 18:14:39 +0000830 if not isfunction(func):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000831 raise TypeError('{!r} is not a Python function'.format(func))
Guido van Rossum2e65f892007-02-28 22:03:49 +0000832 args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
Christian Heimes25bb7832008-01-11 16:17:00 +0000833 return FullArgSpec(args, varargs, varkw, func.__defaults__,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000834 kwonlyargs, func.__kwdefaults__, func.__annotations__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000835
Christian Heimes25bb7832008-01-11 16:17:00 +0000836ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
837
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000838def getargvalues(frame):
839 """Get information about arguments passed into a particular frame.
840
841 A tuple of four things is returned: (args, varargs, varkw, locals).
842 'args' is a list of the argument names (it may contain nested lists).
843 'varargs' and 'varkw' are the names of the * and ** arguments or None.
844 'locals' is the locals dictionary of the given frame."""
845 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000846 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000847
848def joinseq(seq):
849 if len(seq) == 1:
850 return '(' + seq[0] + ',)'
851 else:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000852 return '(' + ', '.join(seq) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000853
854def strseq(object, convert, join=joinseq):
855 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000856 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000857 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
858 else:
859 return convert(object)
860
Guido van Rossum2e65f892007-02-28 22:03:49 +0000861def formatannotation(annotation, base_module=None):
862 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +0000863 if annotation.__module__ in ('builtins', base_module):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000864 return annotation.__name__
865 return annotation.__module__+'.'+annotation.__name__
866 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000867
Guido van Rossum2e65f892007-02-28 22:03:49 +0000868def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000869 module = getattr(object, '__module__', None)
870 def _formatannotation(annotation):
871 return formatannotation(annotation, module)
872 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +0000873
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000874def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000875 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000876 formatarg=str,
877 formatvarargs=lambda name: '*' + name,
878 formatvarkw=lambda name: '**' + name,
879 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +0000880 formatreturns=lambda text: ' -> ' + text,
881 formatannotation=formatannotation,
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000882 join=joinseq):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000883 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +0000884 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000885
Guido van Rossum2e65f892007-02-28 22:03:49 +0000886 The first seven arguments are (args, varargs, varkw, defaults,
887 kwonlyargs, kwonlydefaults, annotations). The other five arguments
888 are the corresponding optional formatting functions that are called to
889 turn names and values into strings. The last argument is an optional
890 function to format the sequence of arguments."""
891 def formatargandannotation(arg):
892 result = formatarg(arg)
893 if arg in annotations:
894 result += ': ' + formatannotation(annotations[arg])
895 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000896 specs = []
897 if defaults:
898 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000899 for i, arg in enumerate(args):
900 spec = strseq(arg, formatargandannotation, join)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000901 if defaults and i >= firstdefault:
902 spec = spec + formatvalue(defaults[i - firstdefault])
903 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000904 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000905 specs.append(formatvarargs(formatargandannotation(varargs)))
906 else:
907 if kwonlyargs:
908 specs.append('*')
909 if kwonlyargs:
910 for kwonlyarg in kwonlyargs:
911 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000912 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000913 spec += formatvalue(kwonlydefaults[kwonlyarg])
914 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000915 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000916 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000917 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +0000918 if 'return' in annotations:
919 result += formatreturns(formatannotation(annotations['return']))
920 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000921
922def formatargvalues(args, varargs, varkw, locals,
923 formatarg=str,
924 formatvarargs=lambda name: '*' + name,
925 formatvarkw=lambda name: '**' + name,
926 formatvalue=lambda value: '=' + repr(value),
927 join=joinseq):
928 """Format an argument spec from the 4 values returned by getargvalues.
929
930 The first four arguments are (args, varargs, varkw, locals). The
931 next four arguments are the corresponding optional formatting functions
932 that are called to turn names and values into strings. The ninth
933 argument is an optional function to format the sequence of arguments."""
934 def convert(name, locals=locals,
935 formatarg=formatarg, formatvalue=formatvalue):
936 return formatarg(name) + formatvalue(locals[name])
937 specs = []
938 for i in range(len(args)):
939 specs.append(strseq(args[i], convert, join))
940 if varargs:
941 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
942 if varkw:
943 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000944 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000945
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000946def getcallargs(func, *positional, **named):
947 """Get the mapping of arguments to values.
948
949 A dict is returned, with keys the function argument names (including the
950 names of the * and ** arguments, if any), and values the respective bound
951 values from 'positional' and 'named'."""
952 spec = getfullargspec(func)
953 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
954 f_name = func.__name__
955 arg2value = {}
956
957 if ismethod(func) and func.__self__ is not None:
958 # implicit 'self' (or 'cls' for classmethods) argument
959 positional = (func.__self__,) + positional
960 num_pos = len(positional)
961 num_total = num_pos + len(named)
962 num_args = len(args)
963 num_defaults = len(defaults) if defaults else 0
964 for arg, value in zip(args, positional):
965 arg2value[arg] = value
966 if varargs:
967 if num_pos > num_args:
968 arg2value[varargs] = positional[-(num_pos-num_args):]
969 else:
970 arg2value[varargs] = ()
971 elif 0 < num_args < num_pos:
Benjamin Peterson88968ad2010-06-25 19:30:21 +0000972 raise TypeError('%s() takes %s %d positional %s (%d given)' % (
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000973 f_name, 'at most' if defaults else 'exactly', num_args,
974 'arguments' if num_args > 1 else 'argument', num_total))
975 elif num_args == 0 and num_total:
976 raise TypeError('%s() takes no arguments (%d given)' %
977 (f_name, num_total))
978
979 for arg in itertools.chain(args, kwonlyargs):
980 if arg in named:
981 if arg in arg2value:
982 raise TypeError("%s() got multiple values for keyword "
983 "argument '%s'" % (f_name, arg))
984 else:
985 arg2value[arg] = named.pop(arg)
986 for kwonlyarg in kwonlyargs:
987 if kwonlyarg not in arg2value:
988 try:
989 arg2value[kwonlyarg] = kwonlydefaults[kwonlyarg]
990 except KeyError:
991 raise TypeError("%s() needs keyword-only argument %s" %
992 (f_name, kwonlyarg))
993 if defaults: # fill in any missing values with the defaults
994 for arg, value in zip(args[-num_defaults:], defaults):
995 if arg not in arg2value:
996 arg2value[arg] = value
997 if varkw:
998 arg2value[varkw] = named
999 elif named:
1000 unexpected = next(iter(named))
1001 raise TypeError("%s() got an unexpected keyword argument '%s'" %
1002 (f_name, unexpected))
1003 unassigned = num_args - len([arg for arg in args if arg in arg2value])
1004 if unassigned:
1005 num_required = num_args - num_defaults
1006 raise TypeError('%s() takes %s %d %s (%d given)' % (
1007 f_name, 'at least' if defaults else 'exactly', num_required,
1008 'arguments' if num_required > 1 else 'argument', num_total))
1009 return arg2value
1010
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001011# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +00001012
1013Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
1014
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001015def getframeinfo(frame, context=1):
1016 """Get information about a frame or traceback object.
1017
1018 A tuple of five things is returned: the filename, the line number of
1019 the current line, the function name, a list of lines of context from
1020 the source code, and the index of the current line within that list.
1021 The optional second argument specifies the number of lines of context
1022 to return, which are centered around the current line."""
1023 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001024 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001025 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001026 else:
1027 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001028 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001029 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001030
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001031 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001032 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001033 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001034 try:
1035 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001036 except IOError:
1037 lines = index = None
1038 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001039 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001040 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001041 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001042 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001043 else:
1044 lines = index = None
1045
Christian Heimes25bb7832008-01-11 16:17:00 +00001046 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001047
1048def getlineno(frame):
1049 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001050 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1051 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001052
1053def getouterframes(frame, context=1):
1054 """Get a list of records for a frame and all higher (calling) frames.
1055
1056 Each record contains a frame object, filename, line number, function
1057 name, a list of lines of context, and index within the context."""
1058 framelist = []
1059 while frame:
1060 framelist.append((frame,) + getframeinfo(frame, context))
1061 frame = frame.f_back
1062 return framelist
1063
1064def getinnerframes(tb, context=1):
1065 """Get a list of records for a traceback's frame and all lower frames.
1066
1067 Each record contains a frame object, filename, line number, function
1068 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001069 framelist = []
1070 while tb:
1071 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
1072 tb = tb.tb_next
1073 return framelist
1074
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001075def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001076 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001077 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001078
1079def stack(context=1):
1080 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001081 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001082
1083def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001084 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001085 return getinnerframes(sys.exc_info()[2], context)