blob: ffbe66fbe1ff9b32ecb7d8e778d7d537ef004fbf [file] [log] [blame]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001"""Get useful information from live Python objects.
2
3This module encapsulates the interface provided by the internal special
Neal Norwitz221085d2007-02-25 20:55:47 +00004attributes (co_*, im_*, tb_*, etc.) in a friendlier fashion.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00005It also provides some help for examining source code and class layout.
6
7Here are some of the useful functions provided by this module:
8
Christian Heimes7131fd92008-02-19 14:21:46 +00009 ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
10 isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
11 isroutine() - check object types
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000012 getmembers() - get members of an object that satisfy a given condition
13
14 getfile(), getsourcefile(), getsource() - find an object's source code
15 getdoc(), getcomments() - get documentation on an object
16 getmodule() - determine the module that an object came from
17 getclasstree() - arrange classes so as to represent their hierarchy
18
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +000019 getargspec(), getargvalues(), getcallargs() - get info about function arguments
Guido van Rossum2e65f892007-02-28 22:03:49 +000020 getfullargspec() - same, with support for Python-3000 features
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000021 formatargspec(), formatargvalues() - format an argument spec
22 getouterframes(), getinnerframes() - get info about frames
23 currentframe() - get the current stack frame
24 stack(), trace() - get info about frames on the stack or in a traceback
25"""
26
27# This module is in the public domain. No warranties.
28
Ka-Ping Yee8b58b842001-03-01 13:56:16 +000029__author__ = 'Ka-Ping Yee <ping@lfw.org>'
30__date__ = '1 Jan 2001'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000031
Christian Heimes7131fd92008-02-19 14:21:46 +000032import sys
33import os
34import types
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +000035import itertools
Christian Heimes7131fd92008-02-19 14:21:46 +000036import string
37import re
Christian Heimes7131fd92008-02-19 14:21:46 +000038import imp
39import tokenize
40import linecache
Raymond Hettingera1a992c2005-03-11 06:46:45 +000041from operator import attrgetter
Christian Heimes25bb7832008-01-11 16:17:00 +000042from collections import namedtuple
Nick Coghlan09c81232010-08-17 10:18:16 +000043
44# Create constants for the compiler flags in Include/code.h
45# We try to get them from dis to avoid duplication, but fall
46# back to hardcording so the dependency is optional
47try:
48 from dis import COMPILER_FLAG_NAMES as _flag_names
49except ImportError:
50 CO_OPTIMIZED, CO_NEWLOCALS = 0x1, 0x2
51 CO_VARARGS, CO_VARKEYWORDS = 0x4, 0x8
52 CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
53else:
54 mod_dict = globals()
55 for k, v in _flag_names.items():
56 mod_dict["CO_" + v] = k
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000057
Christian Heimesbe5b30b2008-03-03 19:18:51 +000058# See Include/object.h
59TPFLAGS_IS_ABSTRACT = 1 << 20
60
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000061# ----------------------------------------------------------- type-checking
62def ismodule(object):
63 """Return true if the object is a module.
64
65 Module objects provide these attributes:
Barry Warsaw28a691b2010-04-17 00:19:56 +000066 __cached__ pathname to byte compiled file
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000067 __doc__ documentation string
68 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000069 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000070
71def isclass(object):
72 """Return true if the object is a class.
73
74 Class objects provide these attributes:
75 __doc__ documentation string
76 __module__ name of module in which this class was defined"""
Benjamin Petersonc4656002009-01-17 22:41:18 +000077 return isinstance(object, type)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000078
79def ismethod(object):
80 """Return true if the object is an instance method.
81
82 Instance method objects provide these attributes:
83 __doc__ documentation string
84 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000085 __func__ function object containing implementation of method
86 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000087 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000088
Tim Peters536d2262001-09-20 05:13:38 +000089def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000090 """Return true if the object is a method descriptor.
91
92 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000093
94 This is new in Python 2.2, and, for example, is true of int.__add__.
95 An object passing this test has a __get__ attribute but not a __set__
96 attribute, but beyond that the set of attributes varies. __name__ is
97 usually sensible, and __doc__ often is.
98
Tim Petersf1d90b92001-09-20 05:47:55 +000099 Methods implemented via descriptors that also pass one of the other
100 tests return false from the ismethoddescriptor() test, simply because
101 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +0000102 __func__ attribute (etc) when an object passes ismethod()."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100103 if isclass(object) or ismethod(object) or isfunction(object):
104 # mutual exclusion
105 return False
106 tp = type(object)
107 return hasattr(tp, "__get__") and not hasattr(tp, "__set__")
Tim Peters536d2262001-09-20 05:13:38 +0000108
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000109def isdatadescriptor(object):
110 """Return true if the object is a data descriptor.
111
112 Data descriptors have both a __get__ and a __set__ attribute. Examples are
113 properties (defined in Python) and getsets and members (defined in C).
114 Typically, data descriptors will also have __name__ and __doc__ attributes
115 (properties, getsets, and members have both of these attributes), but this
116 is not guaranteed."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100117 if isclass(object) or ismethod(object) or isfunction(object):
118 # mutual exclusion
119 return False
120 tp = type(object)
121 return hasattr(tp, "__set__") and hasattr(tp, "__get__")
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000122
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000123if hasattr(types, 'MemberDescriptorType'):
124 # CPython and equivalent
125 def ismemberdescriptor(object):
126 """Return true if the object is a member descriptor.
127
128 Member descriptors are specialized descriptors defined in extension
129 modules."""
130 return isinstance(object, types.MemberDescriptorType)
131else:
132 # Other implementations
133 def ismemberdescriptor(object):
134 """Return true if the object is a member descriptor.
135
136 Member descriptors are specialized descriptors defined in extension
137 modules."""
138 return False
139
140if hasattr(types, 'GetSetDescriptorType'):
141 # CPython and equivalent
142 def isgetsetdescriptor(object):
143 """Return true if the object is a getset descriptor.
144
145 getset descriptors are specialized descriptors defined in extension
146 modules."""
147 return isinstance(object, types.GetSetDescriptorType)
148else:
149 # Other implementations
150 def isgetsetdescriptor(object):
151 """Return true if the object is a getset descriptor.
152
153 getset descriptors are specialized descriptors defined in extension
154 modules."""
155 return False
156
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000157def isfunction(object):
158 """Return true if the object is a user-defined function.
159
160 Function objects provide these attributes:
161 __doc__ documentation string
162 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000163 __code__ code object containing compiled function bytecode
164 __defaults__ tuple of any default values for arguments
165 __globals__ global namespace in which this function was defined
166 __annotations__ dict of parameter annotations
167 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000168 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000169
Christian Heimes7131fd92008-02-19 14:21:46 +0000170def isgeneratorfunction(object):
171 """Return true if the object is a user-defined generator function.
172
173 Generator function objects provides same attributes as functions.
174
Alexander Belopolsky977a6842010-08-16 20:17:07 +0000175 See help(isfunction) for attributes listing."""
Georg Brandlb1441c72009-01-03 22:33:39 +0000176 return bool((isfunction(object) or ismethod(object)) and
177 object.__code__.co_flags & CO_GENERATOR)
Christian Heimes7131fd92008-02-19 14:21:46 +0000178
179def isgenerator(object):
180 """Return true if the object is a generator.
181
182 Generator objects provide these attributes:
183 __iter__ defined to support interation over container
184 close raises a new GeneratorExit exception inside the
185 generator to terminate the iteration
186 gi_code code object
187 gi_frame frame object or possibly None once the generator has
188 been exhausted
189 gi_running set to 1 when generator is executing, 0 otherwise
190 next return the next item from the container
191 send resumes the generator and "sends" a value that becomes
192 the result of the current yield-expression
193 throw used to raise an exception inside the generator"""
194 return isinstance(object, types.GeneratorType)
195
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000196def istraceback(object):
197 """Return true if the object is a traceback.
198
199 Traceback objects provide these attributes:
200 tb_frame frame object at this level
201 tb_lasti index of last attempted instruction in bytecode
202 tb_lineno current line number in Python source code
203 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000204 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000205
206def isframe(object):
207 """Return true if the object is a frame object.
208
209 Frame objects provide these attributes:
210 f_back next outer frame object (this frame's caller)
211 f_builtins built-in namespace seen by this frame
212 f_code code object being executed in this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000213 f_globals global namespace seen by this frame
214 f_lasti index of last attempted instruction in bytecode
215 f_lineno current line number in Python source code
216 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000217 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000218 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000219
220def iscode(object):
221 """Return true if the object is a code object.
222
223 Code objects provide these attributes:
224 co_argcount number of arguments (not including * or ** args)
225 co_code string of raw compiled bytecode
226 co_consts tuple of constants used in the bytecode
227 co_filename name of file in which this code object was created
228 co_firstlineno number of first line in Python source code
229 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
230 co_lnotab encoded mapping of line numbers to bytecode indices
231 co_name name with which this code object was defined
232 co_names tuple of names of local variables
233 co_nlocals number of local variables
234 co_stacksize virtual machine stack space required
235 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000236 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000237
238def isbuiltin(object):
239 """Return true if the object is a built-in function or method.
240
241 Built-in functions and methods provide these attributes:
242 __doc__ documentation string
243 __name__ original name of this function or method
244 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000245 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000246
247def isroutine(object):
248 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000249 return (isbuiltin(object)
250 or isfunction(object)
251 or ismethod(object)
252 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000253
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000254def isabstract(object):
255 """Return true if the object is an abstract base class (ABC)."""
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000256 return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT)
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000257
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000258def getmembers(object, predicate=None):
259 """Return all members of an object as (name, value) pairs sorted by name.
260 Optionally, only return members that satisfy a given predicate."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100261 if isclass(object):
262 mro = (object,) + getmro(object)
263 else:
264 mro = ()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000265 results = []
266 for key in dir(object):
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100267 # First try to get the value via __dict__. Some descriptors don't
268 # like calling their __get__ (see bug #1785).
269 for base in mro:
270 if key in base.__dict__:
271 value = base.__dict__[key]
272 break
273 else:
274 try:
275 value = getattr(object, key)
276 except AttributeError:
277 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000278 if not predicate or predicate(value):
279 results.append((key, value))
280 results.sort()
281 return results
282
Christian Heimes25bb7832008-01-11 16:17:00 +0000283Attribute = namedtuple('Attribute', 'name kind defining_class object')
284
Tim Peters13b49d32001-09-23 02:00:29 +0000285def classify_class_attrs(cls):
286 """Return list of attribute-descriptor tuples.
287
288 For each name in dir(cls), the return list contains a 4-tuple
289 with these elements:
290
291 0. The name (a string).
292
293 1. The kind of attribute this is, one of these strings:
294 'class method' created via classmethod()
295 'static method' created via staticmethod()
296 'property' created via property()
297 'method' any other flavor of method
298 'data' not a method
299
300 2. The class which defined this attribute (a class).
301
302 3. The object as obtained directly from the defining class's
303 __dict__, not via getattr. This is especially important for
304 data attributes: C.data is just a data object, but
305 C.__dict__['data'] may be a data descriptor with additional
306 info, like a __doc__ string.
307 """
308
309 mro = getmro(cls)
310 names = dir(cls)
311 result = []
312 for name in names:
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100313 # Get the object associated with the name, and where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000314 # Getting an obj from the __dict__ sometimes reveals more than
315 # using getattr. Static and class methods are dramatic examples.
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100316 # Furthermore, some objects may raise an Exception when fetched with
317 # getattr(). This is the case with some descriptors (bug #1785).
318 # Thus, we only use getattr() as a last resort.
319 homecls = None
320 for base in (cls,) + mro:
321 if name in base.__dict__:
322 obj = base.__dict__[name]
323 homecls = base
324 break
Tim Peters13b49d32001-09-23 02:00:29 +0000325 else:
326 obj = getattr(cls, name)
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100327 homecls = getattr(obj, "__objclass__", homecls)
Tim Peters13b49d32001-09-23 02:00:29 +0000328
329 # Classify the object.
330 if isinstance(obj, staticmethod):
331 kind = "static method"
332 elif isinstance(obj, classmethod):
333 kind = "class method"
334 elif isinstance(obj, property):
335 kind = "property"
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100336 elif ismethoddescriptor(obj):
Tim Peters13b49d32001-09-23 02:00:29 +0000337 kind = "method"
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100338 elif isdatadescriptor(obj):
Tim Peters13b49d32001-09-23 02:00:29 +0000339 kind = "data"
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100340 else:
341 obj_via_getattr = getattr(cls, name)
342 if (isfunction(obj_via_getattr) or
343 ismethoddescriptor(obj_via_getattr)):
344 kind = "method"
345 else:
346 kind = "data"
347 obj = obj_via_getattr
Tim Peters13b49d32001-09-23 02:00:29 +0000348
Christian Heimes25bb7832008-01-11 16:17:00 +0000349 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000350
351 return result
352
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000353# ----------------------------------------------------------- class helpers
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000354
355def getmro(cls):
356 "Return tuple of base classes (including cls) in method resolution order."
Benjamin Petersonb82c8e52010-11-04 00:38:49 +0000357 return cls.__mro__
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000358
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
Éric Araujoa74f8ef2011-11-29 16:58:53 +0100499 for modname, module in list(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."""
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500534
535 file = getfile(object)
536 sourcefile = getsourcefile(object)
537 if not sourcefile and file[0] + file[-1] != '<>':
R. David Murray74b89242009-05-13 17:33:03 +0000538 raise IOError('source code not available')
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500539 file = sourcefile if sourcefile else file
540
Thomas Wouters89f507f2006-12-13 04:49:30 +0000541 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000542 if module:
543 lines = linecache.getlines(file, module.__dict__)
544 else:
545 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000546 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000547 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000548
549 if ismodule(object):
550 return lines, 0
551
552 if isclass(object):
553 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000554 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
555 # make some effort to find the best matching class definition:
556 # use the one with the least indentation, which is the one
557 # that's most probably not inside a function definition.
558 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000559 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000560 match = pat.match(lines[i])
561 if match:
562 # if it's at toplevel, it's already the best one
563 if lines[i][0] == 'c':
564 return lines, i
565 # else add whitespace to candidate list
566 candidates.append((match.group(1), i))
567 if candidates:
568 # this will sort by whitespace, and by line number,
569 # less whitespace first
570 candidates.sort()
571 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000572 else:
573 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000574
575 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000576 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000577 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000578 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000579 if istraceback(object):
580 object = object.tb_frame
581 if isframe(object):
582 object = object.f_code
583 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000584 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000585 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000586 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000587 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000588 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000589 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000590 lnum = lnum - 1
591 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000592 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000593
594def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000595 """Get lines of comments immediately preceding an object's source code.
596
597 Returns None when source can't be found.
598 """
599 try:
600 lines, lnum = findsource(object)
601 except (IOError, TypeError):
602 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000603
604 if ismodule(object):
605 # Look for a comment block at the top of the file.
606 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000607 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000608 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000609 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000610 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000611 comments = []
612 end = start
613 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000614 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000615 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000616 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000617
618 # Look for a preceding block of comments at the same indentation.
619 elif lnum > 0:
620 indent = indentsize(lines[lnum])
621 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000622 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000623 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000624 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000625 if end > 0:
626 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000627 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000628 while comment[:1] == '#' and indentsize(lines[end]) == indent:
629 comments[:0] = [comment]
630 end = end - 1
631 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000632 comment = lines[end].expandtabs().lstrip()
633 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000634 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000635 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000636 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000637 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000638
Tim Peters4efb6e92001-06-29 23:51:08 +0000639class EndOfBlock(Exception): pass
640
641class BlockFinder:
642 """Provide a tokeneater() method to detect the end of a code block."""
643 def __init__(self):
644 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000645 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000646 self.started = False
647 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000648 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000649
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000650 def tokeneater(self, type, token, srowcol, erowcol, line):
Tim Peters4efb6e92001-06-29 23:51:08 +0000651 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000652 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000653 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000654 if token == "lambda":
655 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000656 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000657 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000658 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000659 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000660 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000661 if self.islambda: # lambdas always end at the first NEWLINE
662 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000663 elif self.passline:
664 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000665 elif type == tokenize.INDENT:
666 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000667 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000668 elif type == tokenize.DEDENT:
669 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000670 # the end of matching indent/dedent pairs end a block
671 # (note that this only works for "def"/"class" blocks,
672 # not e.g. for "if: else:" or "try: finally:" blocks)
673 if self.indent <= 0:
674 raise EndOfBlock
675 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
676 # any other token on the same indentation level end the previous
677 # block as well, except the pseudo-tokens COMMENT and NL.
678 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000679
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000680def getblock(lines):
681 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000682 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000683 try:
Trent Nelson428de652008-03-18 22:41:35 +0000684 tokens = tokenize.generate_tokens(iter(lines).__next__)
685 for _token in tokens:
686 blockfinder.tokeneater(*_token)
Armin Rigodd5c0232005-09-25 11:45:45 +0000687 except (EndOfBlock, IndentationError):
688 pass
689 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000690
691def getsourcelines(object):
692 """Return a list of source lines and starting line number for an object.
693
694 The argument may be a module, class, method, function, traceback, frame,
695 or code object. The source code is returned as a list of the lines
696 corresponding to the object and the line number indicates where in the
697 original source file the first line of code was found. An IOError is
698 raised if the source code cannot be retrieved."""
699 lines, lnum = findsource(object)
700
701 if ismodule(object): return lines, 0
702 else: return getblock(lines[lnum:]), lnum + 1
703
704def getsource(object):
705 """Return the text of the source code for an object.
706
707 The argument may be a module, class, method, function, traceback, frame,
708 or code object. The source code is returned as a single string. An
709 IOError is raised if the source code cannot be retrieved."""
710 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000711 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000712
713# --------------------------------------------------- class tree extraction
714def walktree(classes, children, parent):
715 """Recursive helper function for getclasstree()."""
716 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000717 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000718 for c in classes:
719 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000720 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000721 results.append(walktree(children[c], children, c))
722 return results
723
Georg Brandl5ce83a02009-06-01 17:23:51 +0000724def getclasstree(classes, unique=False):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000725 """Arrange the given list of classes into a hierarchy of nested lists.
726
727 Where a nested list appears, it contains classes derived from the class
728 whose entry immediately precedes the list. Each entry is a 2-tuple
729 containing a class and a tuple of its base classes. If the 'unique'
730 argument is true, exactly one entry appears in the returned structure
731 for each class in the given list. Otherwise, classes using multiple
732 inheritance and their descendants will appear multiple times."""
733 children = {}
734 roots = []
735 for c in classes:
736 if c.__bases__:
737 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000738 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000739 children[parent] = []
740 children[parent].append(c)
741 if unique and parent in classes: break
742 elif c not in roots:
743 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000744 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000745 if parent not in classes:
746 roots.append(parent)
747 return walktree(roots, children, None)
748
749# ------------------------------------------------ argument list extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000750Arguments = namedtuple('Arguments', 'args, varargs, varkw')
751
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000752def getargs(co):
753 """Get information about the arguments accepted by a code object.
754
Guido van Rossum2e65f892007-02-28 22:03:49 +0000755 Three things are returned: (args, varargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000756 'args' is the list of argument names. Keyword-only arguments are
757 appended. 'varargs' and 'varkw' are the names of the * and **
758 arguments or None."""
Guido van Rossum2e65f892007-02-28 22:03:49 +0000759 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000760 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000761
762def _getfullargs(co):
763 """Get information about the arguments accepted by a code object.
764
765 Four things are returned: (args, varargs, kwonlyargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000766 'args' and 'kwonlyargs' are lists of argument names, and 'varargs'
767 and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000768
769 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000770 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000771
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000772 nargs = co.co_argcount
773 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000774 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000775 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000776 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000777 step = 0
778
Guido van Rossum2e65f892007-02-28 22:03:49 +0000779 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000780 varargs = None
781 if co.co_flags & CO_VARARGS:
782 varargs = co.co_varnames[nargs]
783 nargs = nargs + 1
784 varkw = None
785 if co.co_flags & CO_VARKEYWORDS:
786 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000787 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000788
Christian Heimes25bb7832008-01-11 16:17:00 +0000789
790ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
791
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000792def getargspec(func):
793 """Get the names and default values of a function's arguments.
794
795 A tuple of four things is returned: (args, varargs, varkw, defaults).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000796 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000797 'args' will include keyword-only argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000798 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000799 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000800
Guido van Rossum2e65f892007-02-28 22:03:49 +0000801 Use the getfullargspec() API for Python-3000 code, as annotations
802 and keyword arguments are supported. getargspec() will raise ValueError
803 if the func has either annotations or keyword arguments.
804 """
805
806 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
807 getfullargspec(func)
808 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000809 raise ValueError("Function has keyword-only arguments or annotations"
810 ", use getfullargspec() API which can support them")
Christian Heimes25bb7832008-01-11 16:17:00 +0000811 return ArgSpec(args, varargs, varkw, defaults)
812
813FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +0000814 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000815
816def getfullargspec(func):
817 """Get the names and default values of a function's arguments.
818
Brett Cannon504d8852007-09-07 02:12:14 +0000819 A tuple of seven things is returned:
820 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000821 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000822 'varargs' and 'varkw' are the names of the * and ** arguments or None.
823 'defaults' is an n-tuple of the default values of the last n arguments.
824 'kwonlyargs' is a list of keyword-only argument names.
825 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
826 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000827
Guido van Rossum2e65f892007-02-28 22:03:49 +0000828 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000829 """
830
831 if ismethod(func):
Christian Heimesff737952007-11-27 10:40:20 +0000832 func = func.__func__
Jeremy Hylton64967882003-06-27 18:14:39 +0000833 if not isfunction(func):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000834 raise TypeError('{!r} is not a Python function'.format(func))
Guido van Rossum2e65f892007-02-28 22:03:49 +0000835 args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
Christian Heimes25bb7832008-01-11 16:17:00 +0000836 return FullArgSpec(args, varargs, varkw, func.__defaults__,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000837 kwonlyargs, func.__kwdefaults__, func.__annotations__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000838
Christian Heimes25bb7832008-01-11 16:17:00 +0000839ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
840
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000841def getargvalues(frame):
842 """Get information about arguments passed into a particular frame.
843
844 A tuple of four things is returned: (args, varargs, varkw, locals).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000845 'args' is a list of the argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000846 'varargs' and 'varkw' are the names of the * and ** arguments or None.
847 'locals' is the locals dictionary of the given frame."""
848 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000849 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000850
Guido van Rossum2e65f892007-02-28 22:03:49 +0000851def formatannotation(annotation, base_module=None):
852 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +0000853 if annotation.__module__ in ('builtins', base_module):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000854 return annotation.__name__
855 return annotation.__module__+'.'+annotation.__name__
856 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000857
Guido van Rossum2e65f892007-02-28 22:03:49 +0000858def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000859 module = getattr(object, '__module__', None)
860 def _formatannotation(annotation):
861 return formatannotation(annotation, module)
862 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +0000863
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000864def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000865 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000866 formatarg=str,
867 formatvarargs=lambda name: '*' + name,
868 formatvarkw=lambda name: '**' + name,
869 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +0000870 formatreturns=lambda text: ' -> ' + text,
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000871 formatannotation=formatannotation):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000872 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +0000873 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000874
Guido van Rossum2e65f892007-02-28 22:03:49 +0000875 The first seven arguments are (args, varargs, varkw, defaults,
876 kwonlyargs, kwonlydefaults, annotations). The other five arguments
877 are the corresponding optional formatting functions that are called to
878 turn names and values into strings. The last argument is an optional
879 function to format the sequence of arguments."""
880 def formatargandannotation(arg):
881 result = formatarg(arg)
882 if arg in annotations:
883 result += ': ' + formatannotation(annotations[arg])
884 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000885 specs = []
886 if defaults:
887 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000888 for i, arg in enumerate(args):
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000889 spec = formatargandannotation(arg)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000890 if defaults and i >= firstdefault:
891 spec = spec + formatvalue(defaults[i - firstdefault])
892 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000893 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000894 specs.append(formatvarargs(formatargandannotation(varargs)))
895 else:
896 if kwonlyargs:
897 specs.append('*')
898 if kwonlyargs:
899 for kwonlyarg in kwonlyargs:
900 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000901 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000902 spec += formatvalue(kwonlydefaults[kwonlyarg])
903 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000904 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000905 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000906 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +0000907 if 'return' in annotations:
908 result += formatreturns(formatannotation(annotations['return']))
909 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000910
911def formatargvalues(args, varargs, varkw, locals,
912 formatarg=str,
913 formatvarargs=lambda name: '*' + name,
914 formatvarkw=lambda name: '**' + name,
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000915 formatvalue=lambda value: '=' + repr(value)):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000916 """Format an argument spec from the 4 values returned by getargvalues.
917
918 The first four arguments are (args, varargs, varkw, locals). The
919 next four arguments are the corresponding optional formatting functions
920 that are called to turn names and values into strings. The ninth
921 argument is an optional function to format the sequence of arguments."""
922 def convert(name, locals=locals,
923 formatarg=formatarg, formatvalue=formatvalue):
924 return formatarg(name) + formatvalue(locals[name])
925 specs = []
926 for i in range(len(args)):
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000927 specs.append(convert(args[i]))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000928 if varargs:
929 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
930 if varkw:
931 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000932 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000933
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000934def getcallargs(func, *positional, **named):
935 """Get the mapping of arguments to values.
936
937 A dict is returned, with keys the function argument names (including the
938 names of the * and ** arguments, if any), and values the respective bound
939 values from 'positional' and 'named'."""
940 spec = getfullargspec(func)
941 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
942 f_name = func.__name__
943 arg2value = {}
944
945 if ismethod(func) and func.__self__ is not None:
946 # implicit 'self' (or 'cls' for classmethods) argument
947 positional = (func.__self__,) + positional
948 num_pos = len(positional)
949 num_total = num_pos + len(named)
950 num_args = len(args)
951 num_defaults = len(defaults) if defaults else 0
952 for arg, value in zip(args, positional):
953 arg2value[arg] = value
954 if varargs:
955 if num_pos > num_args:
956 arg2value[varargs] = positional[-(num_pos-num_args):]
957 else:
958 arg2value[varargs] = ()
959 elif 0 < num_args < num_pos:
Benjamin Peterson88968ad2010-06-25 19:30:21 +0000960 raise TypeError('%s() takes %s %d positional %s (%d given)' % (
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000961 f_name, 'at most' if defaults else 'exactly', num_args,
962 'arguments' if num_args > 1 else 'argument', num_total))
963 elif num_args == 0 and num_total:
Benjamin Peterson6a2638b2011-03-28 17:32:31 -0500964 if varkw or kwonlyargs:
965 if num_pos:
966 # XXX: We should use num_pos, but Python also uses num_total:
967 raise TypeError('%s() takes exactly 0 positional arguments '
968 '(%d given)' % (f_name, num_total))
969 else:
970 raise TypeError('%s() takes no arguments (%d given)' %
971 (f_name, num_total))
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000972
973 for arg in itertools.chain(args, kwonlyargs):
974 if arg in named:
975 if arg in arg2value:
976 raise TypeError("%s() got multiple values for keyword "
977 "argument '%s'" % (f_name, arg))
978 else:
979 arg2value[arg] = named.pop(arg)
980 for kwonlyarg in kwonlyargs:
981 if kwonlyarg not in arg2value:
982 try:
983 arg2value[kwonlyarg] = kwonlydefaults[kwonlyarg]
984 except KeyError:
985 raise TypeError("%s() needs keyword-only argument %s" %
986 (f_name, kwonlyarg))
987 if defaults: # fill in any missing values with the defaults
988 for arg, value in zip(args[-num_defaults:], defaults):
989 if arg not in arg2value:
990 arg2value[arg] = value
991 if varkw:
992 arg2value[varkw] = named
993 elif named:
994 unexpected = next(iter(named))
995 raise TypeError("%s() got an unexpected keyword argument '%s'" %
996 (f_name, unexpected))
997 unassigned = num_args - len([arg for arg in args if arg in arg2value])
998 if unassigned:
999 num_required = num_args - num_defaults
1000 raise TypeError('%s() takes %s %d %s (%d given)' % (
1001 f_name, 'at least' if defaults else 'exactly', num_required,
1002 'arguments' if num_required > 1 else 'argument', num_total))
1003 return arg2value
1004
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001005# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +00001006
1007Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
1008
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001009def getframeinfo(frame, context=1):
1010 """Get information about a frame or traceback object.
1011
1012 A tuple of five things is returned: the filename, the line number of
1013 the current line, the function name, a list of lines of context from
1014 the source code, and the index of the current line within that list.
1015 The optional second argument specifies the number of lines of context
1016 to return, which are centered around the current line."""
1017 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001018 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001019 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001020 else:
1021 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001022 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001023 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001024
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001025 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001026 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001027 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001028 try:
1029 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001030 except IOError:
1031 lines = index = None
1032 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001033 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001034 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001035 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001036 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001037 else:
1038 lines = index = None
1039
Christian Heimes25bb7832008-01-11 16:17:00 +00001040 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001041
1042def getlineno(frame):
1043 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001044 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1045 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001046
1047def getouterframes(frame, context=1):
1048 """Get a list of records for a frame and all higher (calling) frames.
1049
1050 Each record contains a frame object, filename, line number, function
1051 name, a list of lines of context, and index within the context."""
1052 framelist = []
1053 while frame:
1054 framelist.append((frame,) + getframeinfo(frame, context))
1055 frame = frame.f_back
1056 return framelist
1057
1058def getinnerframes(tb, context=1):
1059 """Get a list of records for a traceback's frame and all lower frames.
1060
1061 Each record contains a frame object, filename, line number, function
1062 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001063 framelist = []
1064 while tb:
1065 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
1066 tb = tb.tb_next
1067 return framelist
1068
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001069def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001070 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001071 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001072
1073def stack(context=1):
1074 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001075 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001076
1077def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001078 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001079 return getinnerframes(sys.exc_info()[2], context)
Michael Foord95fc51d2010-11-20 15:07:30 +00001080
1081
1082# ------------------------------------------------ static version of getattr
1083
1084_sentinel = object()
1085
Michael Foorde5162652010-11-20 16:40:44 +00001086def _static_getmro(klass):
1087 return type.__dict__['__mro__'].__get__(klass)
1088
Michael Foord95fc51d2010-11-20 15:07:30 +00001089def _check_instance(obj, attr):
1090 instance_dict = {}
1091 try:
1092 instance_dict = object.__getattribute__(obj, "__dict__")
1093 except AttributeError:
1094 pass
Michael Foorddcebe0f2011-03-15 19:20:44 -04001095 return dict.get(instance_dict, attr, _sentinel)
Michael Foord95fc51d2010-11-20 15:07:30 +00001096
1097
1098def _check_class(klass, attr):
Michael Foorde5162652010-11-20 16:40:44 +00001099 for entry in _static_getmro(klass):
Michael Foorda51623b2011-12-18 22:01:40 +00001100 if _shadowed_dict(type(entry)) is _sentinel:
Michael Foorddcebe0f2011-03-15 19:20:44 -04001101 try:
1102 return entry.__dict__[attr]
1103 except KeyError:
1104 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001105 return _sentinel
1106
Michael Foord35184ed2010-11-20 16:58:30 +00001107def _is_type(obj):
1108 try:
1109 _static_getmro(obj)
1110 except TypeError:
1111 return False
1112 return True
1113
Michael Foorddcebe0f2011-03-15 19:20:44 -04001114def _shadowed_dict(klass):
1115 dict_attr = type.__dict__["__dict__"]
1116 for entry in _static_getmro(klass):
1117 try:
1118 class_dict = dict_attr.__get__(entry)["__dict__"]
1119 except KeyError:
1120 pass
1121 else:
1122 if not (type(class_dict) is types.GetSetDescriptorType and
1123 class_dict.__name__ == "__dict__" and
1124 class_dict.__objclass__ is entry):
Michael Foorda51623b2011-12-18 22:01:40 +00001125 return class_dict
1126 return _sentinel
Michael Foord95fc51d2010-11-20 15:07:30 +00001127
1128def getattr_static(obj, attr, default=_sentinel):
1129 """Retrieve attributes without triggering dynamic lookup via the
1130 descriptor protocol, __getattr__ or __getattribute__.
1131
1132 Note: this function may not be able to retrieve all attributes
1133 that getattr can fetch (like dynamically created attributes)
1134 and may find attributes that getattr can't (like descriptors
1135 that raise AttributeError). It can also return descriptor objects
1136 instead of instance members in some cases. See the
1137 documentation for details.
1138 """
1139 instance_result = _sentinel
Michael Foord35184ed2010-11-20 16:58:30 +00001140 if not _is_type(obj):
Michael Foordcc7ebb82010-11-20 16:20:16 +00001141 klass = type(obj)
Michael Foorda51623b2011-12-18 22:01:40 +00001142 dict_attr = _shadowed_dict(klass)
1143 if (dict_attr is _sentinel or
1144 type(dict_attr) is types.MemberDescriptorType):
Michael Foorddcebe0f2011-03-15 19:20:44 -04001145 instance_result = _check_instance(obj, attr)
Michael Foord95fc51d2010-11-20 15:07:30 +00001146 else:
1147 klass = obj
1148
1149 klass_result = _check_class(klass, attr)
1150
1151 if instance_result is not _sentinel and klass_result is not _sentinel:
1152 if (_check_class(type(klass_result), '__get__') is not _sentinel and
1153 _check_class(type(klass_result), '__set__') is not _sentinel):
1154 return klass_result
1155
1156 if instance_result is not _sentinel:
1157 return instance_result
1158 if klass_result is not _sentinel:
1159 return klass_result
1160
1161 if obj is klass:
1162 # for types we check the metaclass too
Michael Foorde5162652010-11-20 16:40:44 +00001163 for entry in _static_getmro(type(klass)):
Michael Foord95fc51d2010-11-20 15:07:30 +00001164 try:
1165 return entry.__dict__[attr]
1166 except KeyError:
1167 pass
1168 if default is not _sentinel:
1169 return default
1170 raise AttributeError(attr)
Nick Coghlane0f04652010-11-21 03:44:04 +00001171
1172
Nick Coghlan7921b9f2010-11-30 06:36:04 +00001173GEN_CREATED = 'GEN_CREATED'
1174GEN_RUNNING = 'GEN_RUNNING'
1175GEN_SUSPENDED = 'GEN_SUSPENDED'
1176GEN_CLOSED = 'GEN_CLOSED'
Nick Coghlane0f04652010-11-21 03:44:04 +00001177
1178def getgeneratorstate(generator):
1179 """Get current state of a generator-iterator.
1180
1181 Possible states are:
1182 GEN_CREATED: Waiting to start execution.
1183 GEN_RUNNING: Currently being executed by the interpreter.
1184 GEN_SUSPENDED: Currently suspended at a yield expression.
1185 GEN_CLOSED: Execution has completed.
1186 """
1187 if generator.gi_running:
1188 return GEN_RUNNING
1189 if generator.gi_frame is None:
1190 return GEN_CLOSED
1191 if generator.gi_frame.f_lasti == -1:
1192 return GEN_CREATED
1193 return GEN_SUSPENDED