blob: 3596014cc2141472c43109c203d9f7ec4ddfb3af [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
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000752 'args' is the list of argument names. Keyword-only arguments are
753 appended. 'varargs' and 'varkw' are the names of the * and **
754 arguments or None."""
Guido van Rossum2e65f892007-02-28 22:03:49 +0000755 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
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000762 'args' and 'kwonlyargs' are lists of argument names, and 'varargs'
763 and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000764
765 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000766 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000767
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000768 nargs = co.co_argcount
769 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000770 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000771 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000772 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000773 step = 0
774
Guido van Rossum2e65f892007-02-28 22:03:49 +0000775 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000776 varargs = None
777 if co.co_flags & CO_VARARGS:
778 varargs = co.co_varnames[nargs]
779 nargs = nargs + 1
780 varkw = None
781 if co.co_flags & CO_VARKEYWORDS:
782 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000783 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000784
Christian Heimes25bb7832008-01-11 16:17:00 +0000785
786ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
787
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000788def getargspec(func):
789 """Get the names and default values of a function's arguments.
790
791 A tuple of four things is returned: (args, varargs, varkw, defaults).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000792 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000793 'args' will include keyword-only argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000794 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000795 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000796
Guido van Rossum2e65f892007-02-28 22:03:49 +0000797 Use the getfullargspec() API for Python-3000 code, as annotations
798 and keyword arguments are supported. getargspec() will raise ValueError
799 if the func has either annotations or keyword arguments.
800 """
801
802 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
803 getfullargspec(func)
804 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000805 raise ValueError("Function has keyword-only arguments or annotations"
806 ", use getfullargspec() API which can support them")
Christian Heimes25bb7832008-01-11 16:17:00 +0000807 return ArgSpec(args, varargs, varkw, defaults)
808
809FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +0000810 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000811
812def getfullargspec(func):
813 """Get the names and default values of a function's arguments.
814
Brett Cannon504d8852007-09-07 02:12:14 +0000815 A tuple of seven things is returned:
816 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000817 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000818 'varargs' and 'varkw' are the names of the * and ** arguments or None.
819 'defaults' is an n-tuple of the default values of the last n arguments.
820 'kwonlyargs' is a list of keyword-only argument names.
821 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
822 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000823
Guido van Rossum2e65f892007-02-28 22:03:49 +0000824 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000825 """
826
827 if ismethod(func):
Christian Heimesff737952007-11-27 10:40:20 +0000828 func = func.__func__
Jeremy Hylton64967882003-06-27 18:14:39 +0000829 if not isfunction(func):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000830 raise TypeError('{!r} is not a Python function'.format(func))
Guido van Rossum2e65f892007-02-28 22:03:49 +0000831 args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
Christian Heimes25bb7832008-01-11 16:17:00 +0000832 return FullArgSpec(args, varargs, varkw, func.__defaults__,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000833 kwonlyargs, func.__kwdefaults__, func.__annotations__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000834
Christian Heimes25bb7832008-01-11 16:17:00 +0000835ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
836
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000837def getargvalues(frame):
838 """Get information about arguments passed into a particular frame.
839
840 A tuple of four things is returned: (args, varargs, varkw, locals).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000841 'args' is a list of the argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000842 'varargs' and 'varkw' are the names of the * and ** arguments or None.
843 'locals' is the locals dictionary of the given frame."""
844 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000845 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000846
Guido van Rossum2e65f892007-02-28 22:03:49 +0000847def formatannotation(annotation, base_module=None):
848 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +0000849 if annotation.__module__ in ('builtins', base_module):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000850 return annotation.__name__
851 return annotation.__module__+'.'+annotation.__name__
852 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000853
Guido van Rossum2e65f892007-02-28 22:03:49 +0000854def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000855 module = getattr(object, '__module__', None)
856 def _formatannotation(annotation):
857 return formatannotation(annotation, module)
858 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +0000859
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000860def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000861 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000862 formatarg=str,
863 formatvarargs=lambda name: '*' + name,
864 formatvarkw=lambda name: '**' + name,
865 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +0000866 formatreturns=lambda text: ' -> ' + text,
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000867 formatannotation=formatannotation):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000868 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +0000869 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000870
Guido van Rossum2e65f892007-02-28 22:03:49 +0000871 The first seven arguments are (args, varargs, varkw, defaults,
872 kwonlyargs, kwonlydefaults, annotations). The other five arguments
873 are the corresponding optional formatting functions that are called to
874 turn names and values into strings. The last argument is an optional
875 function to format the sequence of arguments."""
876 def formatargandannotation(arg):
877 result = formatarg(arg)
878 if arg in annotations:
879 result += ': ' + formatannotation(annotations[arg])
880 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000881 specs = []
882 if defaults:
883 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000884 for i, arg in enumerate(args):
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000885 spec = formatargandannotation(arg)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000886 if defaults and i >= firstdefault:
887 spec = spec + formatvalue(defaults[i - firstdefault])
888 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000889 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000890 specs.append(formatvarargs(formatargandannotation(varargs)))
891 else:
892 if kwonlyargs:
893 specs.append('*')
894 if kwonlyargs:
895 for kwonlyarg in kwonlyargs:
896 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000897 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000898 spec += formatvalue(kwonlydefaults[kwonlyarg])
899 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000900 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000901 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000902 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +0000903 if 'return' in annotations:
904 result += formatreturns(formatannotation(annotations['return']))
905 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000906
907def formatargvalues(args, varargs, varkw, locals,
908 formatarg=str,
909 formatvarargs=lambda name: '*' + name,
910 formatvarkw=lambda name: '**' + name,
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000911 formatvalue=lambda value: '=' + repr(value)):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000912 """Format an argument spec from the 4 values returned by getargvalues.
913
914 The first four arguments are (args, varargs, varkw, locals). The
915 next four arguments are the corresponding optional formatting functions
916 that are called to turn names and values into strings. The ninth
917 argument is an optional function to format the sequence of arguments."""
918 def convert(name, locals=locals,
919 formatarg=formatarg, formatvalue=formatvalue):
920 return formatarg(name) + formatvalue(locals[name])
921 specs = []
922 for i in range(len(args)):
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000923 specs.append(convert(args[i]))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000924 if varargs:
925 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
926 if varkw:
927 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000928 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000929
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000930def getcallargs(func, *positional, **named):
931 """Get the mapping of arguments to values.
932
933 A dict is returned, with keys the function argument names (including the
934 names of the * and ** arguments, if any), and values the respective bound
935 values from 'positional' and 'named'."""
936 spec = getfullargspec(func)
937 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
938 f_name = func.__name__
939 arg2value = {}
940
941 if ismethod(func) and func.__self__ is not None:
942 # implicit 'self' (or 'cls' for classmethods) argument
943 positional = (func.__self__,) + positional
944 num_pos = len(positional)
945 num_total = num_pos + len(named)
946 num_args = len(args)
947 num_defaults = len(defaults) if defaults else 0
948 for arg, value in zip(args, positional):
949 arg2value[arg] = value
950 if varargs:
951 if num_pos > num_args:
952 arg2value[varargs] = positional[-(num_pos-num_args):]
953 else:
954 arg2value[varargs] = ()
955 elif 0 < num_args < num_pos:
Benjamin Peterson88968ad2010-06-25 19:30:21 +0000956 raise TypeError('%s() takes %s %d positional %s (%d given)' % (
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000957 f_name, 'at most' if defaults else 'exactly', num_args,
958 'arguments' if num_args > 1 else 'argument', num_total))
959 elif num_args == 0 and num_total:
960 raise TypeError('%s() takes no arguments (%d given)' %
961 (f_name, num_total))
962
963 for arg in itertools.chain(args, kwonlyargs):
964 if arg in named:
965 if arg in arg2value:
966 raise TypeError("%s() got multiple values for keyword "
967 "argument '%s'" % (f_name, arg))
968 else:
969 arg2value[arg] = named.pop(arg)
970 for kwonlyarg in kwonlyargs:
971 if kwonlyarg not in arg2value:
972 try:
973 arg2value[kwonlyarg] = kwonlydefaults[kwonlyarg]
974 except KeyError:
975 raise TypeError("%s() needs keyword-only argument %s" %
976 (f_name, kwonlyarg))
977 if defaults: # fill in any missing values with the defaults
978 for arg, value in zip(args[-num_defaults:], defaults):
979 if arg not in arg2value:
980 arg2value[arg] = value
981 if varkw:
982 arg2value[varkw] = named
983 elif named:
984 unexpected = next(iter(named))
985 raise TypeError("%s() got an unexpected keyword argument '%s'" %
986 (f_name, unexpected))
987 unassigned = num_args - len([arg for arg in args if arg in arg2value])
988 if unassigned:
989 num_required = num_args - num_defaults
990 raise TypeError('%s() takes %s %d %s (%d given)' % (
991 f_name, 'at least' if defaults else 'exactly', num_required,
992 'arguments' if num_required > 1 else 'argument', num_total))
993 return arg2value
994
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000995# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000996
997Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
998
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000999def getframeinfo(frame, context=1):
1000 """Get information about a frame or traceback object.
1001
1002 A tuple of five things is returned: the filename, the line number of
1003 the current line, the function name, a list of lines of context from
1004 the source code, and the index of the current line within that list.
1005 The optional second argument specifies the number of lines of context
1006 to return, which are centered around the current line."""
1007 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001008 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001009 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001010 else:
1011 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001012 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001013 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001014
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001015 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001016 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001017 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001018 try:
1019 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001020 except IOError:
1021 lines = index = None
1022 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001023 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001024 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001025 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001026 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001027 else:
1028 lines = index = None
1029
Christian Heimes25bb7832008-01-11 16:17:00 +00001030 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001031
1032def getlineno(frame):
1033 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001034 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1035 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001036
1037def getouterframes(frame, context=1):
1038 """Get a list of records for a frame and all higher (calling) frames.
1039
1040 Each record contains a frame object, filename, line number, function
1041 name, a list of lines of context, and index within the context."""
1042 framelist = []
1043 while frame:
1044 framelist.append((frame,) + getframeinfo(frame, context))
1045 frame = frame.f_back
1046 return framelist
1047
1048def getinnerframes(tb, context=1):
1049 """Get a list of records for a traceback's frame and all lower frames.
1050
1051 Each record contains a frame object, filename, line number, function
1052 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001053 framelist = []
1054 while tb:
1055 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
1056 tb = tb.tb_next
1057 return framelist
1058
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001059def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001060 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001061 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001062
1063def stack(context=1):
1064 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001065 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001066
1067def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001068 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001069 return getinnerframes(sys.exc_info()[2], context)