blob: 9898b114aae6c2be1819a90cb8b187728d5de56b [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 re
Christian Heimes7131fd92008-02-19 14:21:46 +000037import imp
38import tokenize
39import linecache
Raymond Hettingera1a992c2005-03-11 06:46:45 +000040from operator import attrgetter
Christian Heimes25bb7832008-01-11 16:17:00 +000041from collections import namedtuple
Nick Coghlan09c81232010-08-17 10:18:16 +000042
43# Create constants for the compiler flags in Include/code.h
44# We try to get them from dis to avoid duplication, but fall
45# back to hardcording so the dependency is optional
46try:
47 from dis import COMPILER_FLAG_NAMES as _flag_names
48except ImportError:
49 CO_OPTIMIZED, CO_NEWLOCALS = 0x1, 0x2
50 CO_VARARGS, CO_VARKEYWORDS = 0x4, 0x8
51 CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
52else:
53 mod_dict = globals()
54 for k, v in _flag_names.items():
55 mod_dict["CO_" + v] = k
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000056
Christian Heimesbe5b30b2008-03-03 19:18:51 +000057# See Include/object.h
58TPFLAGS_IS_ABSTRACT = 1 << 20
59
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000060# ----------------------------------------------------------- type-checking
61def ismodule(object):
62 """Return true if the object is a module.
63
64 Module objects provide these attributes:
Barry Warsaw28a691b2010-04-17 00:19:56 +000065 __cached__ pathname to byte compiled file
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000066 __doc__ documentation string
67 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000068 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000069
70def isclass(object):
71 """Return true if the object is a class.
72
73 Class objects provide these attributes:
74 __doc__ documentation string
75 __module__ name of module in which this class was defined"""
Benjamin Petersonc4656002009-01-17 22:41:18 +000076 return isinstance(object, type)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000077
78def ismethod(object):
79 """Return true if the object is an instance method.
80
81 Instance method objects provide these attributes:
82 __doc__ documentation string
83 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000084 __func__ function object containing implementation of method
85 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000086 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000087
Tim Peters536d2262001-09-20 05:13:38 +000088def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000089 """Return true if the object is a method descriptor.
90
91 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000092
93 This is new in Python 2.2, and, for example, is true of int.__add__.
94 An object passing this test has a __get__ attribute but not a __set__
95 attribute, but beyond that the set of attributes varies. __name__ is
96 usually sensible, and __doc__ often is.
97
Tim Petersf1d90b92001-09-20 05:47:55 +000098 Methods implemented via descriptors that also pass one of the other
99 tests return false from the ismethoddescriptor() test, simply because
100 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +0000101 __func__ attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +0000102 return (hasattr(object, "__get__")
103 and not hasattr(object, "__set__") # else it's a data descriptor
104 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +0000105 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +0000106 and not isclass(object))
107
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000108def isdatadescriptor(object):
109 """Return true if the object is a data descriptor.
110
111 Data descriptors have both a __get__ and a __set__ attribute. Examples are
112 properties (defined in Python) and getsets and members (defined in C).
113 Typically, data descriptors will also have __name__ and __doc__ attributes
114 (properties, getsets, and members have both of these attributes), but this
115 is not guaranteed."""
116 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
117
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000118if hasattr(types, 'MemberDescriptorType'):
119 # CPython and equivalent
120 def ismemberdescriptor(object):
121 """Return true if the object is a member descriptor.
122
123 Member descriptors are specialized descriptors defined in extension
124 modules."""
125 return isinstance(object, types.MemberDescriptorType)
126else:
127 # Other implementations
128 def ismemberdescriptor(object):
129 """Return true if the object is a member descriptor.
130
131 Member descriptors are specialized descriptors defined in extension
132 modules."""
133 return False
134
135if hasattr(types, 'GetSetDescriptorType'):
136 # CPython and equivalent
137 def isgetsetdescriptor(object):
138 """Return true if the object is a getset descriptor.
139
140 getset descriptors are specialized descriptors defined in extension
141 modules."""
142 return isinstance(object, types.GetSetDescriptorType)
143else:
144 # Other implementations
145 def isgetsetdescriptor(object):
146 """Return true if the object is a getset descriptor.
147
148 getset descriptors are specialized descriptors defined in extension
149 modules."""
150 return False
151
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000152def isfunction(object):
153 """Return true if the object is a user-defined function.
154
155 Function objects provide these attributes:
156 __doc__ documentation string
157 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000158 __code__ code object containing compiled function bytecode
159 __defaults__ tuple of any default values for arguments
160 __globals__ global namespace in which this function was defined
161 __annotations__ dict of parameter annotations
162 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000163 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000164
Christian Heimes7131fd92008-02-19 14:21:46 +0000165def isgeneratorfunction(object):
166 """Return true if the object is a user-defined generator function.
167
168 Generator function objects provides same attributes as functions.
169
Alexander Belopolsky977a6842010-08-16 20:17:07 +0000170 See help(isfunction) for attributes listing."""
Georg Brandlb1441c72009-01-03 22:33:39 +0000171 return bool((isfunction(object) or ismethod(object)) and
172 object.__code__.co_flags & CO_GENERATOR)
Christian Heimes7131fd92008-02-19 14:21:46 +0000173
174def isgenerator(object):
175 """Return true if the object is a generator.
176
177 Generator objects provide these attributes:
178 __iter__ defined to support interation over container
179 close raises a new GeneratorExit exception inside the
180 generator to terminate the iteration
181 gi_code code object
182 gi_frame frame object or possibly None once the generator has
183 been exhausted
184 gi_running set to 1 when generator is executing, 0 otherwise
185 next return the next item from the container
186 send resumes the generator and "sends" a value that becomes
187 the result of the current yield-expression
188 throw used to raise an exception inside the generator"""
189 return isinstance(object, types.GeneratorType)
190
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000191def istraceback(object):
192 """Return true if the object is a traceback.
193
194 Traceback objects provide these attributes:
195 tb_frame frame object at this level
196 tb_lasti index of last attempted instruction in bytecode
197 tb_lineno current line number in Python source code
198 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000199 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000200
201def isframe(object):
202 """Return true if the object is a frame object.
203
204 Frame objects provide these attributes:
205 f_back next outer frame object (this frame's caller)
206 f_builtins built-in namespace seen by this frame
207 f_code code object being executed in this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000208 f_globals global namespace seen by this frame
209 f_lasti index of last attempted instruction in bytecode
210 f_lineno current line number in Python source code
211 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000212 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000213 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000214
215def iscode(object):
216 """Return true if the object is a code object.
217
218 Code objects provide these attributes:
219 co_argcount number of arguments (not including * or ** args)
220 co_code string of raw compiled bytecode
221 co_consts tuple of constants used in the bytecode
222 co_filename name of file in which this code object was created
223 co_firstlineno number of first line in Python source code
224 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
225 co_lnotab encoded mapping of line numbers to bytecode indices
226 co_name name with which this code object was defined
227 co_names tuple of names of local variables
228 co_nlocals number of local variables
229 co_stacksize virtual machine stack space required
230 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000231 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000232
233def isbuiltin(object):
234 """Return true if the object is a built-in function or method.
235
236 Built-in functions and methods provide these attributes:
237 __doc__ documentation string
238 __name__ original name of this function or method
239 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000240 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000241
242def isroutine(object):
243 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000244 return (isbuiltin(object)
245 or isfunction(object)
246 or ismethod(object)
247 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000248
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000249def isabstract(object):
250 """Return true if the object is an abstract base class (ABC)."""
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000251 return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT)
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000252
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000253def getmembers(object, predicate=None):
254 """Return all members of an object as (name, value) pairs sorted by name.
255 Optionally, only return members that satisfy a given predicate."""
256 results = []
257 for key in dir(object):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000258 try:
259 value = getattr(object, key)
260 except AttributeError:
261 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000262 if not predicate or predicate(value):
263 results.append((key, value))
264 results.sort()
265 return results
266
Christian Heimes25bb7832008-01-11 16:17:00 +0000267Attribute = namedtuple('Attribute', 'name kind defining_class object')
268
Tim Peters13b49d32001-09-23 02:00:29 +0000269def classify_class_attrs(cls):
270 """Return list of attribute-descriptor tuples.
271
272 For each name in dir(cls), the return list contains a 4-tuple
273 with these elements:
274
275 0. The name (a string).
276
277 1. The kind of attribute this is, one of these strings:
278 'class method' created via classmethod()
279 'static method' created via staticmethod()
280 'property' created via property()
281 'method' any other flavor of method
282 'data' not a method
283
284 2. The class which defined this attribute (a class).
285
286 3. The object as obtained directly from the defining class's
287 __dict__, not via getattr. This is especially important for
288 data attributes: C.data is just a data object, but
289 C.__dict__['data'] may be a data descriptor with additional
290 info, like a __doc__ string.
291 """
292
293 mro = getmro(cls)
294 names = dir(cls)
295 result = []
296 for name in names:
297 # Get the object associated with the name.
298 # Getting an obj from the __dict__ sometimes reveals more than
299 # using getattr. Static and class methods are dramatic examples.
300 if name in cls.__dict__:
301 obj = cls.__dict__[name]
302 else:
303 obj = getattr(cls, name)
304
305 # Figure out where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000306 homecls = getattr(obj, "__objclass__", None)
307 if homecls is None:
Guido van Rossum687ae002001-10-15 22:03:32 +0000308 # search the dicts.
Tim Peters13b49d32001-09-23 02:00:29 +0000309 for base in mro:
310 if name in base.__dict__:
311 homecls = base
312 break
313
314 # Get the object again, in order to get it from the defining
315 # __dict__ instead of via getattr (if possible).
316 if homecls is not None and name in homecls.__dict__:
317 obj = homecls.__dict__[name]
318
319 # Also get the object via getattr.
320 obj_via_getattr = getattr(cls, name)
321
322 # Classify the object.
323 if isinstance(obj, staticmethod):
324 kind = "static method"
325 elif isinstance(obj, classmethod):
326 kind = "class method"
327 elif isinstance(obj, property):
328 kind = "property"
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000329 elif (isfunction(obj_via_getattr) or
Tim Peters13b49d32001-09-23 02:00:29 +0000330 ismethoddescriptor(obj_via_getattr)):
331 kind = "method"
332 else:
333 kind = "data"
334
Christian Heimes25bb7832008-01-11 16:17:00 +0000335 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000336
337 return result
338
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000339# ----------------------------------------------------------- class helpers
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000340
341def getmro(cls):
342 "Return tuple of base classes (including cls) in method resolution order."
Benjamin Petersonb82c8e52010-11-04 00:38:49 +0000343 return cls.__mro__
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000344
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000345# -------------------------------------------------- source code extraction
346def indentsize(line):
347 """Return the indent size, in spaces, at the start of a line of text."""
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000348 expline = line.expandtabs()
349 return len(expline) - len(expline.lstrip())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000350
351def getdoc(object):
352 """Get the documentation string for an object.
353
354 All tabs are expanded to spaces. To clean up docstrings that are
355 indented to line up with blocks of code, any whitespace than can be
356 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000357 try:
358 doc = object.__doc__
359 except AttributeError:
360 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000361 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000362 return None
Georg Brandl0c77a822008-06-10 16:37:50 +0000363 return cleandoc(doc)
364
365def cleandoc(doc):
366 """Clean up indentation from docstrings.
367
368 Any whitespace that can be uniformly removed from the second line
369 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000370 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000371 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000372 except UnicodeError:
373 return None
374 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000375 # Find minimum indentation of any non-blank lines after first line.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000376 margin = sys.maxsize
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000377 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000378 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000379 if content:
380 indent = len(line) - content
381 margin = min(margin, indent)
382 # Remove indentation.
383 if lines:
384 lines[0] = lines[0].lstrip()
Christian Heimesa37d4c62007-12-04 23:02:19 +0000385 if margin < sys.maxsize:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000386 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000387 # Remove any trailing or leading blank lines.
388 while lines and not lines[-1]:
389 lines.pop()
390 while lines and not lines[0]:
391 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000392 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000393
394def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000395 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000396 if ismodule(object):
397 if hasattr(object, '__file__'):
398 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000399 raise TypeError('{!r} is a built-in module'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000400 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000401 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000402 if hasattr(object, '__file__'):
403 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000404 raise TypeError('{!r} is a built-in class'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000405 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000406 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000407 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000408 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000409 if istraceback(object):
410 object = object.tb_frame
411 if isframe(object):
412 object = object.f_code
413 if iscode(object):
414 return object.co_filename
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000415 raise TypeError('{!r} is not a module, class, method, '
416 'function, traceback, frame, or code object'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000417
Christian Heimes25bb7832008-01-11 16:17:00 +0000418ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
419
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000420def getmoduleinfo(path):
421 """Get the module name, suffix, mode, and module type for a given file."""
422 filename = os.path.basename(path)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000423 suffixes = [(-len(suffix), suffix, mode, mtype)
424 for suffix, mode, mtype in imp.get_suffixes()]
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000425 suffixes.sort() # try longest suffixes first, in case they overlap
426 for neglen, suffix, mode, mtype in suffixes:
427 if filename[neglen:] == suffix:
Christian Heimes25bb7832008-01-11 16:17:00 +0000428 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000429
430def getmodulename(path):
431 """Return the module name for a given file, or None."""
432 info = getmoduleinfo(path)
433 if info: return info[0]
434
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000435def getsourcefile(object):
R. David Murraya1b37402010-06-17 02:04:29 +0000436 """Return the filename that can be used to locate an object's source.
437 Return None if no way can be identified to get the source.
438 """
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000439 filename = getfile(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000440 if filename[-4:].lower() in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000441 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000442 for suffix, mode, kind in imp.get_suffixes():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000443 if 'b' in mode and filename[-len(suffix):].lower() == suffix:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000444 # Looks like a binary file. We want to only return a text file.
445 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000446 if os.path.exists(filename):
447 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000448 # only return a non-existent filename if the module has a PEP 302 loader
449 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000450 return filename
R. David Murraya1b37402010-06-17 02:04:29 +0000451 # or it is in the linecache
452 if filename in linecache.cache:
453 return filename
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000454
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000455def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000456 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000457
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000458 The idea is for each object to have a unique origin, so this routine
459 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000460 if _filename is None:
461 _filename = getsourcefile(object) or getfile(object)
462 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000463
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000464modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000465_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000466
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000467def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000468 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000469 if ismodule(object):
470 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000471 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000472 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000473 # Try the filename to modulename cache
474 if _filename is not None and _filename in modulesbyfile:
475 return sys.modules.get(modulesbyfile[_filename])
476 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000477 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000478 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000479 except TypeError:
480 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000481 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000482 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000483 # Update the filename to module name cache and check yet again
484 # Copy sys.modules in order to cope with changes while iterating
485 for modname, module in sys.modules.items():
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000486 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487 f = module.__file__
488 if f == _filesbymodname.get(modname, None):
489 # Have already mapped this module, so skip it
490 continue
491 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000492 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000494 modulesbyfile[f] = modulesbyfile[
495 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000496 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000497 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000498 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000499 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000500 if not hasattr(object, '__name__'):
501 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000502 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000503 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000504 if mainobject is object:
505 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000506 # Check builtins
Georg Brandl1a3284e2007-12-02 09:40:06 +0000507 builtin = sys.modules['builtins']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000508 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000509 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000510 if builtinobject is object:
511 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000512
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000513def findsource(object):
514 """Return the entire source file and starting line number for an object.
515
516 The argument may be a module, class, method, function, traceback, frame,
517 or code object. The source code is returned as a list of all the lines
518 in the file and the line number indexes a line in that list. An IOError
519 is raised if the source code cannot be retrieved."""
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500520
521 file = getfile(object)
522 sourcefile = getsourcefile(object)
523 if not sourcefile and file[0] + file[-1] != '<>':
R. David Murray74b89242009-05-13 17:33:03 +0000524 raise IOError('source code not available')
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500525 file = sourcefile if sourcefile else file
526
Thomas Wouters89f507f2006-12-13 04:49:30 +0000527 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000528 if module:
529 lines = linecache.getlines(file, module.__dict__)
530 else:
531 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000532 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000533 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000534
535 if ismodule(object):
536 return lines, 0
537
538 if isclass(object):
539 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000540 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
541 # make some effort to find the best matching class definition:
542 # use the one with the least indentation, which is the one
543 # that's most probably not inside a function definition.
544 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000545 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 match = pat.match(lines[i])
547 if match:
548 # if it's at toplevel, it's already the best one
549 if lines[i][0] == 'c':
550 return lines, i
551 # else add whitespace to candidate list
552 candidates.append((match.group(1), i))
553 if candidates:
554 # this will sort by whitespace, and by line number,
555 # less whitespace first
556 candidates.sort()
557 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000558 else:
559 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000560
561 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000562 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000563 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000564 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000565 if istraceback(object):
566 object = object.tb_frame
567 if isframe(object):
568 object = object.f_code
569 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000570 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000571 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000572 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000573 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000574 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000575 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000576 lnum = lnum - 1
577 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000578 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000579
580def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000581 """Get lines of comments immediately preceding an object's source code.
582
583 Returns None when source can't be found.
584 """
585 try:
586 lines, lnum = findsource(object)
587 except (IOError, TypeError):
588 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000589
590 if ismodule(object):
591 # Look for a comment block at the top of the file.
592 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000593 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000594 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000595 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000596 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000597 comments = []
598 end = start
599 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000600 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000601 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000602 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000603
604 # Look for a preceding block of comments at the same indentation.
605 elif lnum > 0:
606 indent = indentsize(lines[lnum])
607 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000608 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000609 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000610 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000611 if end > 0:
612 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000613 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000614 while comment[:1] == '#' and indentsize(lines[end]) == indent:
615 comments[:0] = [comment]
616 end = end - 1
617 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000618 comment = lines[end].expandtabs().lstrip()
619 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000620 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000621 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000622 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000623 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000624
Tim Peters4efb6e92001-06-29 23:51:08 +0000625class EndOfBlock(Exception): pass
626
627class BlockFinder:
628 """Provide a tokeneater() method to detect the end of a code block."""
629 def __init__(self):
630 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000631 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000632 self.started = False
633 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000634 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000635
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000636 def tokeneater(self, type, token, srowcol, erowcol, line):
Tim Peters4efb6e92001-06-29 23:51:08 +0000637 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000638 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000639 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000640 if token == "lambda":
641 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000642 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000643 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000644 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000645 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000646 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000647 if self.islambda: # lambdas always end at the first NEWLINE
648 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000649 elif self.passline:
650 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000651 elif type == tokenize.INDENT:
652 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000653 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000654 elif type == tokenize.DEDENT:
655 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000656 # the end of matching indent/dedent pairs end a block
657 # (note that this only works for "def"/"class" blocks,
658 # not e.g. for "if: else:" or "try: finally:" blocks)
659 if self.indent <= 0:
660 raise EndOfBlock
661 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
662 # any other token on the same indentation level end the previous
663 # block as well, except the pseudo-tokens COMMENT and NL.
664 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000665
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000666def getblock(lines):
667 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000668 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000669 try:
Trent Nelson428de652008-03-18 22:41:35 +0000670 tokens = tokenize.generate_tokens(iter(lines).__next__)
671 for _token in tokens:
672 blockfinder.tokeneater(*_token)
Armin Rigodd5c0232005-09-25 11:45:45 +0000673 except (EndOfBlock, IndentationError):
674 pass
675 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000676
677def getsourcelines(object):
678 """Return a list of source lines and starting line number for an object.
679
680 The argument may be a module, class, method, function, traceback, frame,
681 or code object. The source code is returned as a list of the lines
682 corresponding to the object and the line number indicates where in the
683 original source file the first line of code was found. An IOError is
684 raised if the source code cannot be retrieved."""
685 lines, lnum = findsource(object)
686
687 if ismodule(object): return lines, 0
688 else: return getblock(lines[lnum:]), lnum + 1
689
690def getsource(object):
691 """Return the text of the source code for an object.
692
693 The argument may be a module, class, method, function, traceback, frame,
694 or code object. The source code is returned as a single string. An
695 IOError is raised if the source code cannot be retrieved."""
696 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000697 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000698
699# --------------------------------------------------- class tree extraction
700def walktree(classes, children, parent):
701 """Recursive helper function for getclasstree()."""
702 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000703 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000704 for c in classes:
705 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000706 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000707 results.append(walktree(children[c], children, c))
708 return results
709
Georg Brandl5ce83a02009-06-01 17:23:51 +0000710def getclasstree(classes, unique=False):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000711 """Arrange the given list of classes into a hierarchy of nested lists.
712
713 Where a nested list appears, it contains classes derived from the class
714 whose entry immediately precedes the list. Each entry is a 2-tuple
715 containing a class and a tuple of its base classes. If the 'unique'
716 argument is true, exactly one entry appears in the returned structure
717 for each class in the given list. Otherwise, classes using multiple
718 inheritance and their descendants will appear multiple times."""
719 children = {}
720 roots = []
721 for c in classes:
722 if c.__bases__:
723 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000724 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000725 children[parent] = []
726 children[parent].append(c)
727 if unique and parent in classes: break
728 elif c not in roots:
729 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000730 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000731 if parent not in classes:
732 roots.append(parent)
733 return walktree(roots, children, None)
734
735# ------------------------------------------------ argument list extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000736Arguments = namedtuple('Arguments', 'args, varargs, varkw')
737
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000738def getargs(co):
739 """Get information about the arguments accepted by a code object.
740
Guido van Rossum2e65f892007-02-28 22:03:49 +0000741 Three things are returned: (args, varargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000742 'args' is the list of argument names. Keyword-only arguments are
743 appended. 'varargs' and 'varkw' are the names of the * and **
744 arguments or None."""
Guido van Rossum2e65f892007-02-28 22:03:49 +0000745 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000746 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000747
748def _getfullargs(co):
749 """Get information about the arguments accepted by a code object.
750
751 Four things are returned: (args, varargs, kwonlyargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000752 'args' and 'kwonlyargs' are lists of argument names, and 'varargs'
753 and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000754
755 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000756 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000757
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000758 nargs = co.co_argcount
759 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000760 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000761 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000762 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000763 step = 0
764
Guido van Rossum2e65f892007-02-28 22:03:49 +0000765 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000766 varargs = None
767 if co.co_flags & CO_VARARGS:
768 varargs = co.co_varnames[nargs]
769 nargs = nargs + 1
770 varkw = None
771 if co.co_flags & CO_VARKEYWORDS:
772 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000773 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000774
Christian Heimes25bb7832008-01-11 16:17:00 +0000775
776ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
777
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000778def getargspec(func):
779 """Get the names and default values of a function's arguments.
780
781 A tuple of four things is returned: (args, varargs, varkw, defaults).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000782 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000783 'args' will include keyword-only argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000784 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000785 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000786
Guido van Rossum2e65f892007-02-28 22:03:49 +0000787 Use the getfullargspec() API for Python-3000 code, as annotations
788 and keyword arguments are supported. getargspec() will raise ValueError
789 if the func has either annotations or keyword arguments.
790 """
791
792 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
793 getfullargspec(func)
794 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000795 raise ValueError("Function has keyword-only arguments or annotations"
796 ", use getfullargspec() API which can support them")
Christian Heimes25bb7832008-01-11 16:17:00 +0000797 return ArgSpec(args, varargs, varkw, defaults)
798
799FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +0000800 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000801
802def getfullargspec(func):
803 """Get the names and default values of a function's arguments.
804
Brett Cannon504d8852007-09-07 02:12:14 +0000805 A tuple of seven things is returned:
806 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000807 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000808 'varargs' and 'varkw' are the names of the * and ** arguments or None.
809 'defaults' is an n-tuple of the default values of the last n arguments.
810 'kwonlyargs' is a list of keyword-only argument names.
811 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
812 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000813
Guido van Rossum2e65f892007-02-28 22:03:49 +0000814 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000815 """
816
817 if ismethod(func):
Christian Heimesff737952007-11-27 10:40:20 +0000818 func = func.__func__
Jeremy Hylton64967882003-06-27 18:14:39 +0000819 if not isfunction(func):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000820 raise TypeError('{!r} is not a Python function'.format(func))
Guido van Rossum2e65f892007-02-28 22:03:49 +0000821 args, varargs, kwonlyargs, varkw = _getfullargs(func.__code__)
Christian Heimes25bb7832008-01-11 16:17:00 +0000822 return FullArgSpec(args, varargs, varkw, func.__defaults__,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000823 kwonlyargs, func.__kwdefaults__, func.__annotations__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000824
Christian Heimes25bb7832008-01-11 16:17:00 +0000825ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
826
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000827def getargvalues(frame):
828 """Get information about arguments passed into a particular frame.
829
830 A tuple of four things is returned: (args, varargs, varkw, locals).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000831 'args' is a list of the argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000832 'varargs' and 'varkw' are the names of the * and ** arguments or None.
833 'locals' is the locals dictionary of the given frame."""
834 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000835 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000836
Guido van Rossum2e65f892007-02-28 22:03:49 +0000837def formatannotation(annotation, base_module=None):
838 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +0000839 if annotation.__module__ in ('builtins', base_module):
Guido van Rossum2e65f892007-02-28 22:03:49 +0000840 return annotation.__name__
841 return annotation.__module__+'.'+annotation.__name__
842 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000843
Guido van Rossum2e65f892007-02-28 22:03:49 +0000844def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000845 module = getattr(object, '__module__', None)
846 def _formatannotation(annotation):
847 return formatannotation(annotation, module)
848 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +0000849
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000850def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +0000851 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000852 formatarg=str,
853 formatvarargs=lambda name: '*' + name,
854 formatvarkw=lambda name: '**' + name,
855 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +0000856 formatreturns=lambda text: ' -> ' + text,
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000857 formatannotation=formatannotation):
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000858 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +0000859 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000860
Guido van Rossum2e65f892007-02-28 22:03:49 +0000861 The first seven arguments are (args, varargs, varkw, defaults,
862 kwonlyargs, kwonlydefaults, annotations). The other five arguments
863 are the corresponding optional formatting functions that are called to
864 turn names and values into strings. The last argument is an optional
865 function to format the sequence of arguments."""
866 def formatargandannotation(arg):
867 result = formatarg(arg)
868 if arg in annotations:
869 result += ': ' + formatannotation(annotations[arg])
870 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000871 specs = []
872 if defaults:
873 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000874 for i, arg in enumerate(args):
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000875 spec = formatargandannotation(arg)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000876 if defaults and i >= firstdefault:
877 spec = spec + formatvalue(defaults[i - firstdefault])
878 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000879 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000880 specs.append(formatvarargs(formatargandannotation(varargs)))
881 else:
882 if kwonlyargs:
883 specs.append('*')
884 if kwonlyargs:
885 for kwonlyarg in kwonlyargs:
886 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000887 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000888 spec += formatvalue(kwonlydefaults[kwonlyarg])
889 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000890 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +0000891 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000892 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +0000893 if 'return' in annotations:
894 result += formatreturns(formatannotation(annotations['return']))
895 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000896
897def formatargvalues(args, varargs, varkw, locals,
898 formatarg=str,
899 formatvarargs=lambda name: '*' + name,
900 formatvarkw=lambda name: '**' + name,
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000901 formatvalue=lambda value: '=' + repr(value)):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000902 """Format an argument spec from the 4 values returned by getargvalues.
903
904 The first four arguments are (args, varargs, varkw, locals). The
905 next four arguments are the corresponding optional formatting functions
906 that are called to turn names and values into strings. The ninth
907 argument is an optional function to format the sequence of arguments."""
908 def convert(name, locals=locals,
909 formatarg=formatarg, formatvalue=formatvalue):
910 return formatarg(name) + formatvalue(locals[name])
911 specs = []
912 for i in range(len(args)):
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000913 specs.append(convert(args[i]))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000914 if varargs:
915 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
916 if varkw:
917 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000918 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000919
Benjamin Petersone109c702011-06-24 09:37:26 -0500920def _missing_arguments(f_name, argnames, pos, values):
921 names = [repr(name) for name in argnames if name not in values]
922 missing = len(names)
923 if missing == 1:
924 s = names[0]
925 elif missing == 2:
926 s = "{} and {}".format(*names)
927 else:
928 tail = ", {} and {}".format(names[-2:])
929 del names[-2:]
930 s = ", ".join(names) + tail
931 raise TypeError("%s() missing %i required %s argument%s: %s" %
932 (f_name, missing,
933 "positional" if pos else "keyword-only",
934 "" if missing == 1 else "s", s))
935
936def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
Benjamin Petersonb204a422011-06-05 22:04:07 -0500937 atleast = len(args) - defcount
Benjamin Petersonb204a422011-06-05 22:04:07 -0500938 kwonly_given = len([arg for arg in kwonly if arg in values])
939 if varargs:
940 plural = atleast != 1
941 sig = "at least %d" % (atleast,)
942 elif defcount:
943 plural = True
944 sig = "from %d to %d" % (atleast, len(args))
945 else:
946 plural = len(args) != 1
947 sig = str(len(args))
948 kwonly_sig = ""
949 if kwonly_given:
950 msg = " positional argument%s (and %d keyword-only argument%s)"
951 kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
952 "s" if kwonly_given != 1 else ""))
953 raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
954 (f_name, sig, "s" if plural else "", given, kwonly_sig,
955 "was" if given == 1 and not kwonly_given else "were"))
956
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000957def getcallargs(func, *positional, **named):
958 """Get the mapping of arguments to values.
959
960 A dict is returned, with keys the function argument names (including the
961 names of the * and ** arguments, if any), and values the respective bound
962 values from 'positional' and 'named'."""
963 spec = getfullargspec(func)
964 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
965 f_name = func.__name__
966 arg2value = {}
967
Benjamin Petersonb204a422011-06-05 22:04:07 -0500968
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000969 if ismethod(func) and func.__self__ is not None:
970 # implicit 'self' (or 'cls' for classmethods) argument
971 positional = (func.__self__,) + positional
972 num_pos = len(positional)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000973 num_args = len(args)
974 num_defaults = len(defaults) if defaults else 0
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000975
Benjamin Petersonb204a422011-06-05 22:04:07 -0500976 n = min(num_pos, num_args)
977 for i in range(n):
978 arg2value[args[i]] = positional[i]
979 if varargs:
980 arg2value[varargs] = tuple(positional[n:])
981 possible_kwargs = set(args + kwonlyargs)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +0000982 if varkw:
Benjamin Petersonb204a422011-06-05 22:04:07 -0500983 arg2value[varkw] = {}
984 for kw, value in named.items():
985 if kw not in possible_kwargs:
986 if not varkw:
987 raise TypeError("%s() got an unexpected keyword argument %r" %
988 (f_name, kw))
989 arg2value[varkw][kw] = value
990 continue
991 if kw in arg2value:
992 raise TypeError("%s() got multiple values for argument %r" %
993 (f_name, kw))
994 arg2value[kw] = value
995 if num_pos > num_args and not varargs:
Benjamin Petersone109c702011-06-24 09:37:26 -0500996 _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
997 num_pos, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -0500998 if num_pos < num_args:
Benjamin Petersone109c702011-06-24 09:37:26 -0500999 req = args[:num_args - num_defaults]
1000 for arg in req:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001001 if arg not in arg2value:
Benjamin Petersone109c702011-06-24 09:37:26 -05001002 _missing_arguments(f_name, req, True, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001003 for i, arg in enumerate(args[num_args - num_defaults:]):
1004 if arg not in arg2value:
1005 arg2value[arg] = defaults[i]
Benjamin Petersone109c702011-06-24 09:37:26 -05001006 missing = 0
Benjamin Petersonb204a422011-06-05 22:04:07 -05001007 for kwarg in kwonlyargs:
1008 if kwarg not in arg2value:
Benjamin Petersone109c702011-06-24 09:37:26 -05001009 if kwarg in kwonlydefaults:
1010 arg2value[kwarg] = kwonlydefaults[kwarg]
1011 else:
1012 missing += 1
1013 if missing:
1014 _missing_arguments(f_name, kwonlyargs, False, arg2value)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001015 return arg2value
1016
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001017# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +00001018
1019Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
1020
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001021def getframeinfo(frame, context=1):
1022 """Get information about a frame or traceback object.
1023
1024 A tuple of five things is returned: the filename, the line number of
1025 the current line, the function name, a list of lines of context from
1026 the source code, and the index of the current line within that list.
1027 The optional second argument specifies the number of lines of context
1028 to return, which are centered around the current line."""
1029 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001030 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001031 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001032 else:
1033 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001034 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001035 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001036
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001037 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001038 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001039 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001040 try:
1041 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001042 except IOError:
1043 lines = index = None
1044 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001045 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001046 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001047 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001048 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001049 else:
1050 lines = index = None
1051
Christian Heimes25bb7832008-01-11 16:17:00 +00001052 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001053
1054def getlineno(frame):
1055 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001056 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1057 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001058
1059def getouterframes(frame, context=1):
1060 """Get a list of records for a frame and all higher (calling) frames.
1061
1062 Each record contains a frame object, filename, line number, function
1063 name, a list of lines of context, and index within the context."""
1064 framelist = []
1065 while frame:
1066 framelist.append((frame,) + getframeinfo(frame, context))
1067 frame = frame.f_back
1068 return framelist
1069
1070def getinnerframes(tb, context=1):
1071 """Get a list of records for a traceback's frame and all lower frames.
1072
1073 Each record contains a frame object, filename, line number, function
1074 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001075 framelist = []
1076 while tb:
1077 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
1078 tb = tb.tb_next
1079 return framelist
1080
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001081def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001082 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001083 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001084
1085def stack(context=1):
1086 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001087 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001088
1089def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001090 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001091 return getinnerframes(sys.exc_info()[2], context)
Michael Foord95fc51d2010-11-20 15:07:30 +00001092
1093
1094# ------------------------------------------------ static version of getattr
1095
1096_sentinel = object()
1097
Michael Foorde5162652010-11-20 16:40:44 +00001098def _static_getmro(klass):
1099 return type.__dict__['__mro__'].__get__(klass)
1100
Michael Foord95fc51d2010-11-20 15:07:30 +00001101def _check_instance(obj, attr):
1102 instance_dict = {}
1103 try:
1104 instance_dict = object.__getattribute__(obj, "__dict__")
1105 except AttributeError:
1106 pass
Michael Foorddcebe0f2011-03-15 19:20:44 -04001107 return dict.get(instance_dict, attr, _sentinel)
Michael Foord95fc51d2010-11-20 15:07:30 +00001108
1109
1110def _check_class(klass, attr):
Michael Foorde5162652010-11-20 16:40:44 +00001111 for entry in _static_getmro(klass):
Michael Foorddcebe0f2011-03-15 19:20:44 -04001112 if not _shadowed_dict(type(entry)):
1113 try:
1114 return entry.__dict__[attr]
1115 except KeyError:
1116 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001117 return _sentinel
1118
Michael Foord35184ed2010-11-20 16:58:30 +00001119def _is_type(obj):
1120 try:
1121 _static_getmro(obj)
1122 except TypeError:
1123 return False
1124 return True
1125
Michael Foorddcebe0f2011-03-15 19:20:44 -04001126def _shadowed_dict(klass):
1127 dict_attr = type.__dict__["__dict__"]
1128 for entry in _static_getmro(klass):
1129 try:
1130 class_dict = dict_attr.__get__(entry)["__dict__"]
1131 except KeyError:
1132 pass
1133 else:
1134 if not (type(class_dict) is types.GetSetDescriptorType and
1135 class_dict.__name__ == "__dict__" and
1136 class_dict.__objclass__ is entry):
1137 return True
1138 return False
Michael Foord95fc51d2010-11-20 15:07:30 +00001139
1140def getattr_static(obj, attr, default=_sentinel):
1141 """Retrieve attributes without triggering dynamic lookup via the
1142 descriptor protocol, __getattr__ or __getattribute__.
1143
1144 Note: this function may not be able to retrieve all attributes
1145 that getattr can fetch (like dynamically created attributes)
1146 and may find attributes that getattr can't (like descriptors
1147 that raise AttributeError). It can also return descriptor objects
1148 instead of instance members in some cases. See the
1149 documentation for details.
1150 """
1151 instance_result = _sentinel
Michael Foord35184ed2010-11-20 16:58:30 +00001152 if not _is_type(obj):
Michael Foordcc7ebb82010-11-20 16:20:16 +00001153 klass = type(obj)
Michael Foorddcebe0f2011-03-15 19:20:44 -04001154 if not _shadowed_dict(klass):
1155 instance_result = _check_instance(obj, attr)
Michael Foord95fc51d2010-11-20 15:07:30 +00001156 else:
1157 klass = obj
1158
1159 klass_result = _check_class(klass, attr)
1160
1161 if instance_result is not _sentinel and klass_result is not _sentinel:
1162 if (_check_class(type(klass_result), '__get__') is not _sentinel and
1163 _check_class(type(klass_result), '__set__') is not _sentinel):
1164 return klass_result
1165
1166 if instance_result is not _sentinel:
1167 return instance_result
1168 if klass_result is not _sentinel:
1169 return klass_result
1170
1171 if obj is klass:
1172 # for types we check the metaclass too
Michael Foorde5162652010-11-20 16:40:44 +00001173 for entry in _static_getmro(type(klass)):
Michael Foord95fc51d2010-11-20 15:07:30 +00001174 try:
1175 return entry.__dict__[attr]
1176 except KeyError:
1177 pass
1178 if default is not _sentinel:
1179 return default
1180 raise AttributeError(attr)
Nick Coghlane0f04652010-11-21 03:44:04 +00001181
1182
Nick Coghlan7921b9f2010-11-30 06:36:04 +00001183GEN_CREATED = 'GEN_CREATED'
1184GEN_RUNNING = 'GEN_RUNNING'
1185GEN_SUSPENDED = 'GEN_SUSPENDED'
1186GEN_CLOSED = 'GEN_CLOSED'
Nick Coghlane0f04652010-11-21 03:44:04 +00001187
1188def getgeneratorstate(generator):
1189 """Get current state of a generator-iterator.
1190
1191 Possible states are:
1192 GEN_CREATED: Waiting to start execution.
1193 GEN_RUNNING: Currently being executed by the interpreter.
1194 GEN_SUSPENDED: Currently suspended at a yield expression.
1195 GEN_CLOSED: Execution has completed.
1196 """
1197 if generator.gi_running:
1198 return GEN_RUNNING
1199 if generator.gi_frame is None:
1200 return GEN_CLOSED
1201 if generator.gi_frame.f_lasti == -1:
1202 return GEN_CREATED
1203 return GEN_SUSPENDED