blob: cb07b9d9ab1ef11e8bec1787116107bea3e1abd0 [file] [log] [blame]
Martin v. Löwis09776b72002-08-04 17:22:59 +00001# -*- coding: iso-8859-1 -*-
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00002"""Get useful information from live Python objects.
3
4This module encapsulates the interface provided by the internal special
5attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion.
6It also provides some help for examining source code and class layout.
7
8Here are some of the useful functions provided by this module:
9
Facundo Batista759bfc62008-02-18 03:43:43 +000010 ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
11 isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
12 isroutine() - check object types
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000013 getmembers() - get members of an object that satisfy a given condition
14
15 getfile(), getsourcefile(), getsource() - find an object's source code
16 getdoc(), getcomments() - get documentation on an object
17 getmodule() - determine the module that an object came from
18 getclasstree() - arrange classes so as to represent their hierarchy
19
Benjamin Peterson7e213252010-03-30 17:58:13 +000020 getargspec(), getargvalues(), getcallargs() - get info about function arguments
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
Facundo Batista759bfc62008-02-18 03:43:43 +000032import sys
33import os
34import types
35import string
36import re
37import dis
38import imp
39import tokenize
40import linecache
Raymond Hettingera1a992c2005-03-11 06:46:45 +000041from operator import attrgetter
Raymond Hettingere896acc2008-01-11 03:04:50 +000042from collections import namedtuple
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000043
Brett Cannonf5eb2ff2008-08-01 01:40:24 +000044# These constants are from Include/code.h.
45CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 0x1, 0x2, 0x4, 0x8
46CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
Christian Heimes608c1d82008-03-03 18:28:04 +000047# See Include/object.h
48TPFLAGS_IS_ABSTRACT = 1 << 20
49
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000050# ----------------------------------------------------------- type-checking
51def ismodule(object):
52 """Return true if the object is a module.
53
54 Module objects provide these attributes:
55 __doc__ documentation string
56 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000057 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000058
59def isclass(object):
60 """Return true if the object is a class.
61
62 Class objects provide these attributes:
63 __doc__ documentation string
64 __module__ name of module in which this class was defined"""
Benjamin Peterson5e5fbb62009-01-17 22:27:54 +000065 return isinstance(object, (type, types.ClassType))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000066
67def ismethod(object):
68 """Return true if the object is an instance method.
69
70 Instance method objects provide these attributes:
71 __doc__ documentation string
72 __name__ name with which this method was defined
73 im_class class object in which this method belongs
74 im_func function object containing implementation of method
75 im_self instance to which this method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +000076 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000077
Tim Peters536d2262001-09-20 05:13:38 +000078def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000079 """Return true if the object is a method descriptor.
80
81 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000082
83 This is new in Python 2.2, and, for example, is true of int.__add__.
84 An object passing this test has a __get__ attribute but not a __set__
85 attribute, but beyond that the set of attributes varies. __name__ is
86 usually sensible, and __doc__ often is.
87
Tim Petersf1d90b92001-09-20 05:47:55 +000088 Methods implemented via descriptors that also pass one of the other
89 tests return false from the ismethoddescriptor() test, simply because
90 the other tests promise more -- you can, e.g., count on having the
91 im_func attribute (etc) when an object passes ismethod()."""
Tim Peters536d2262001-09-20 05:13:38 +000092 return (hasattr(object, "__get__")
93 and not hasattr(object, "__set__") # else it's a data descriptor
94 and not ismethod(object) # mutual exclusion
Tim Petersf1d90b92001-09-20 05:47:55 +000095 and not isfunction(object)
Tim Peters536d2262001-09-20 05:13:38 +000096 and not isclass(object))
97
Martin v. Löwise59e2ba2003-05-03 09:09:02 +000098def isdatadescriptor(object):
99 """Return true if the object is a data descriptor.
100
101 Data descriptors have both a __get__ and a __set__ attribute. Examples are
102 properties (defined in Python) and getsets and members (defined in C).
103 Typically, data descriptors will also have __name__ and __doc__ attributes
104 (properties, getsets, and members have both of these attributes), but this
105 is not guaranteed."""
106 return (hasattr(object, "__set__") and hasattr(object, "__get__"))
107
Barry Warsaw00decd72006-07-27 23:43:15 +0000108if hasattr(types, 'MemberDescriptorType'):
109 # CPython and equivalent
110 def ismemberdescriptor(object):
111 """Return true if the object is a member descriptor.
112
113 Member descriptors are specialized descriptors defined in extension
114 modules."""
115 return isinstance(object, types.MemberDescriptorType)
116else:
117 # Other implementations
118 def ismemberdescriptor(object):
119 """Return true if the object is a member descriptor.
120
121 Member descriptors are specialized descriptors defined in extension
122 modules."""
123 return False
124
125if hasattr(types, 'GetSetDescriptorType'):
126 # CPython and equivalent
127 def isgetsetdescriptor(object):
128 """Return true if the object is a getset descriptor.
129
130 getset descriptors are specialized descriptors defined in extension
131 modules."""
132 return isinstance(object, types.GetSetDescriptorType)
133else:
134 # Other implementations
135 def isgetsetdescriptor(object):
136 """Return true if the object is a getset descriptor.
137
138 getset descriptors are specialized descriptors defined in extension
139 modules."""
140 return False
Tim Petersce70a3b2006-07-27 23:45:48 +0000141
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000142def isfunction(object):
143 """Return true if the object is a user-defined function.
144
145 Function objects provide these attributes:
146 __doc__ documentation string
147 __name__ name with which this function was defined
148 func_code code object containing compiled function bytecode
149 func_defaults tuple of any default values for arguments
150 func_doc (same as __doc__)
151 func_globals global namespace in which this function was defined
152 func_name (same as __name__)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000153 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000154
Facundo Batista759bfc62008-02-18 03:43:43 +0000155def isgeneratorfunction(object):
156 """Return true if the object is a user-defined generator function.
157
158 Generator function objects provides same attributes as functions.
159
Alexander Belopolskyb8de9fa2010-08-16 20:30:26 +0000160 See help(isfunction) for attributes listing."""
Benjamin Peterson6060d5e2009-01-01 04:04:41 +0000161 return bool((isfunction(object) or ismethod(object)) and
162 object.func_code.co_flags & CO_GENERATOR)
Facundo Batista759bfc62008-02-18 03:43:43 +0000163
164def isgenerator(object):
165 """Return true if the object is a generator.
166
167 Generator objects provide these attributes:
168 __iter__ defined to support interation over container
169 close raises a new GeneratorExit exception inside the
170 generator to terminate the iteration
171 gi_code code object
172 gi_frame frame object or possibly None once the generator has
173 been exhausted
174 gi_running set to 1 when generator is executing, 0 otherwise
175 next return the next item from the container
176 send resumes the generator and "sends" a value that becomes
177 the result of the current yield-expression
178 throw used to raise an exception inside the generator"""
179 return isinstance(object, types.GeneratorType)
180
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000181def istraceback(object):
182 """Return true if the object is a traceback.
183
184 Traceback objects provide these attributes:
185 tb_frame frame object at this level
186 tb_lasti index of last attempted instruction in bytecode
187 tb_lineno current line number in Python source code
188 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000189 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000190
191def isframe(object):
192 """Return true if the object is a frame object.
193
194 Frame objects provide these attributes:
195 f_back next outer frame object (this frame's caller)
196 f_builtins built-in namespace seen by this frame
197 f_code code object being executed in this frame
198 f_exc_traceback traceback if raised in this frame, or None
199 f_exc_type exception type if raised in this frame, or None
200 f_exc_value exception value if raised in this frame, or None
201 f_globals global namespace seen by this frame
202 f_lasti index of last attempted instruction in bytecode
203 f_lineno current line number in Python source code
204 f_locals local namespace seen by this frame
205 f_restricted 0 or 1 if frame is in restricted execution mode
206 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000207 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000208
209def iscode(object):
210 """Return true if the object is a code object.
211
212 Code objects provide these attributes:
213 co_argcount number of arguments (not including * or ** args)
214 co_code string of raw compiled bytecode
215 co_consts tuple of constants used in the bytecode
216 co_filename name of file in which this code object was created
217 co_firstlineno number of first line in Python source code
218 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
219 co_lnotab encoded mapping of line numbers to bytecode indices
220 co_name name with which this code object was defined
221 co_names tuple of names of local variables
222 co_nlocals number of local variables
223 co_stacksize virtual machine stack space required
224 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000225 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000226
227def isbuiltin(object):
228 """Return true if the object is a built-in function or method.
229
230 Built-in functions and methods provide these attributes:
231 __doc__ documentation string
232 __name__ original name of this function or method
233 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000234 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000235
236def isroutine(object):
237 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000238 return (isbuiltin(object)
239 or isfunction(object)
240 or ismethod(object)
241 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000242
Christian Heimes608c1d82008-03-03 18:28:04 +0000243def isabstract(object):
244 """Return true if the object is an abstract base class (ABC)."""
Benjamin Petersonc63457b2009-10-15 03:06:55 +0000245 return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT)
Christian Heimes608c1d82008-03-03 18:28:04 +0000246
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000247def getmembers(object, predicate=None):
248 """Return all members of an object as (name, value) pairs sorted by name.
249 Optionally, only return members that satisfy a given predicate."""
Antoine Pitroub8572a12011-12-21 10:16:14 +0100250 if isclass(object):
251 mro = (object,) + getmro(object)
252 else:
253 mro = ()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000254 results = []
255 for key in dir(object):
Antoine Pitroub8572a12011-12-21 10:16:14 +0100256 # First try to get the value via __dict__. Some descriptors don't
257 # like calling their __get__ (see bug #1785).
258 for base in mro:
259 if key in base.__dict__:
260 value = base.__dict__[key]
261 break
262 else:
263 try:
264 value = getattr(object, key)
265 except AttributeError:
266 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000267 if not predicate or predicate(value):
268 results.append((key, value))
269 results.sort()
270 return results
271
Raymond Hettingere896acc2008-01-11 03:04:50 +0000272Attribute = namedtuple('Attribute', 'name kind defining_class object')
273
Tim Peters13b49d32001-09-23 02:00:29 +0000274def classify_class_attrs(cls):
275 """Return list of attribute-descriptor tuples.
276
277 For each name in dir(cls), the return list contains a 4-tuple
278 with these elements:
279
280 0. The name (a string).
281
282 1. The kind of attribute this is, one of these strings:
283 'class method' created via classmethod()
284 'static method' created via staticmethod()
285 'property' created via property()
286 'method' any other flavor of method
287 'data' not a method
288
289 2. The class which defined this attribute (a class).
290
291 3. The object as obtained directly from the defining class's
292 __dict__, not via getattr. This is especially important for
293 data attributes: C.data is just a data object, but
294 C.__dict__['data'] may be a data descriptor with additional
295 info, like a __doc__ string.
296 """
297
298 mro = getmro(cls)
299 names = dir(cls)
300 result = []
301 for name in names:
Antoine Pitroub8572a12011-12-21 10:16:14 +0100302 # Get the object associated with the name, and where it was defined.
Tim Peters13b49d32001-09-23 02:00:29 +0000303 # Getting an obj from the __dict__ sometimes reveals more than
304 # using getattr. Static and class methods are dramatic examples.
Antoine Pitroub8572a12011-12-21 10:16:14 +0100305 # Furthermore, some objects may raise an Exception when fetched with
306 # getattr(). This is the case with some descriptors (bug #1785).
307 # Thus, we only use getattr() as a last resort.
308 homecls = None
309 for base in (cls,) + mro:
310 if name in base.__dict__:
311 obj = base.__dict__[name]
312 homecls = base
313 break
Tim Peters13b49d32001-09-23 02:00:29 +0000314 else:
315 obj = getattr(cls, name)
Antoine Pitroub8572a12011-12-21 10:16:14 +0100316 homecls = getattr(obj, "__objclass__", homecls)
Tim Peters13b49d32001-09-23 02:00:29 +0000317
318 # Classify the object.
319 if isinstance(obj, staticmethod):
320 kind = "static method"
321 elif isinstance(obj, classmethod):
322 kind = "class method"
323 elif isinstance(obj, property):
324 kind = "property"
Antoine Pitroub8572a12011-12-21 10:16:14 +0100325 elif ismethoddescriptor(obj):
Tim Peters13b49d32001-09-23 02:00:29 +0000326 kind = "method"
Antoine Pitroub8572a12011-12-21 10:16:14 +0100327 elif isdatadescriptor(obj):
Tim Peters13b49d32001-09-23 02:00:29 +0000328 kind = "data"
Antoine Pitroub8572a12011-12-21 10:16:14 +0100329 else:
330 obj_via_getattr = getattr(cls, name)
331 if (ismethod(obj_via_getattr) or
332 ismethoddescriptor(obj_via_getattr)):
333 kind = "method"
334 else:
335 kind = "data"
336 obj = obj_via_getattr
Tim Peters13b49d32001-09-23 02:00:29 +0000337
Raymond Hettingere896acc2008-01-11 03:04:50 +0000338 result.append(Attribute(name, kind, homecls, obj))
Tim Peters13b49d32001-09-23 02:00:29 +0000339
340 return result
341
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000342# ----------------------------------------------------------- class helpers
343def _searchbases(cls, accum):
344 # Simulate the "classic class" search order.
345 if cls in accum:
346 return
347 accum.append(cls)
348 for base in cls.__bases__:
349 _searchbases(base, accum)
350
351def getmro(cls):
352 "Return tuple of base classes (including cls) in method resolution order."
353 if hasattr(cls, "__mro__"):
354 return cls.__mro__
355 else:
356 result = []
357 _searchbases(cls, result)
358 return tuple(result)
359
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000360# -------------------------------------------------- source code extraction
361def indentsize(line):
362 """Return the indent size, in spaces, at the start of a line of text."""
363 expline = string.expandtabs(line)
364 return len(expline) - len(string.lstrip(expline))
365
366def getdoc(object):
367 """Get the documentation string for an object.
368
369 All tabs are expanded to spaces. To clean up docstrings that are
370 indented to line up with blocks of code, any whitespace than can be
371 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000372 try:
373 doc = object.__doc__
374 except AttributeError:
375 return None
Michael W. Hudson755f75e2002-05-20 17:29:46 +0000376 if not isinstance(doc, types.StringTypes):
Tim Peters24008312002-03-17 18:56:20 +0000377 return None
Georg Brandl7be19aa2008-06-07 15:59:10 +0000378 return cleandoc(doc)
379
380def cleandoc(doc):
381 """Clean up indentation from docstrings.
382
383 Any whitespace that can be uniformly removed from the second line
384 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000385 try:
386 lines = string.split(string.expandtabs(doc), '\n')
387 except UnicodeError:
388 return None
389 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000390 # Find minimum indentation of any non-blank lines after first line.
391 margin = sys.maxint
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000392 for line in lines[1:]:
393 content = len(string.lstrip(line))
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000394 if content:
395 indent = len(line) - content
396 margin = min(margin, indent)
397 # Remove indentation.
398 if lines:
399 lines[0] = lines[0].lstrip()
400 if margin < sys.maxint:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000401 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000402 # Remove any trailing or leading blank lines.
403 while lines and not lines[-1]:
404 lines.pop()
405 while lines and not lines[0]:
406 lines.pop(0)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000407 return string.join(lines, '\n')
408
409def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000410 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000411 if ismodule(object):
412 if hasattr(object, '__file__'):
413 return object.__file__
Georg Brandlb0199512009-09-18 13:57:11 +0000414 raise TypeError('{!r} is a built-in module'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000415 if isclass(object):
Ka-Ping Yeec99e0f12001-04-13 12:10:40 +0000416 object = sys.modules.get(object.__module__)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000417 if hasattr(object, '__file__'):
418 return object.__file__
Georg Brandlb0199512009-09-18 13:57:11 +0000419 raise TypeError('{!r} is a built-in class'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000420 if ismethod(object):
421 object = object.im_func
422 if isfunction(object):
423 object = object.func_code
424 if istraceback(object):
425 object = object.tb_frame
426 if isframe(object):
427 object = object.f_code
428 if iscode(object):
429 return object.co_filename
Georg Brandlb0199512009-09-18 13:57:11 +0000430 raise TypeError('{!r} is not a module, class, method, '
431 'function, traceback, frame, or code object'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000432
Raymond Hettingere896acc2008-01-11 03:04:50 +0000433ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
434
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000435def getmoduleinfo(path):
436 """Get the module name, suffix, mode, and module type for a given file."""
437 filename = os.path.basename(path)
Brett Cannonf5eb2ff2008-08-01 01:40:24 +0000438 suffixes = map(lambda info:
439 (-len(info[0]), info[0], info[1], info[2]),
440 imp.get_suffixes())
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000441 suffixes.sort() # try longest suffixes first, in case they overlap
442 for neglen, suffix, mode, mtype in suffixes:
443 if filename[neglen:] == suffix:
Raymond Hettingere896acc2008-01-11 03:04:50 +0000444 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000445
446def getmodulename(path):
447 """Return the module name for a given file, or None."""
448 info = getmoduleinfo(path)
449 if info: return info[0]
450
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000451def getsourcefile(object):
R. David Murraydf1cf302010-06-17 01:36:52 +0000452 """Return the filename that can be used to locate an object's source.
453 Return None if no way can be identified to get the source.
454 """
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000455 filename = getfile(object)
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000456 if string.lower(filename[-4:]) in ('.pyc', '.pyo'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000457 filename = filename[:-4] + '.py'
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000458 for suffix, mode, kind in imp.get_suffixes():
459 if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
460 # Looks like a binary file. We want to only return a text file.
461 return None
Phillip J. Eby72ae6c82006-04-30 15:59:26 +0000462 if os.path.exists(filename):
463 return filename
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000464 # only return a non-existent filename if the module has a PEP 302 loader
465 if hasattr(getmodule(object, filename), '__loader__'):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000466 return filename
R. David Murraydf1cf302010-06-17 01:36:52 +0000467 # or it is in the linecache
468 if filename in linecache.cache:
469 return filename
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000470
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000471def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000472 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000473
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000474 The idea is for each object to have a unique origin, so this routine
475 normalizes the result as much as possible."""
Phillip J. Eby1a2959c2006-07-20 15:54:16 +0000476 if _filename is None:
477 _filename = getsourcefile(object) or getfile(object)
478 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000479
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000480modulesbyfile = {}
Nick Coghlanc495c662006-09-07 10:50:34 +0000481_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000482
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000483def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000484 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000485 if ismodule(object):
486 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000487 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000488 return sys.modules.get(object.__module__)
Nick Coghlanc495c662006-09-07 10:50:34 +0000489 # Try the filename to modulename cache
490 if _filename is not None and _filename in modulesbyfile:
491 return sys.modules.get(modulesbyfile[_filename])
492 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000493 try:
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000494 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000495 except TypeError:
496 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000497 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000498 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000499 # Update the filename to module name cache and check yet again
500 # Copy sys.modules in order to cope with changes while iterating
501 for modname, module in sys.modules.items():
Phillip J. Eby47032112006-04-11 01:07:43 +0000502 if ismodule(module) and hasattr(module, '__file__'):
Nick Coghlanc495c662006-09-07 10:50:34 +0000503 f = module.__file__
504 if f == _filesbymodname.get(modname, None):
505 # Have already mapped this module, so skip it
506 continue
507 _filesbymodname[modname] = f
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000508 f = getabsfile(module)
Nick Coghlanc495c662006-09-07 10:50:34 +0000509 # Always map to the name the module knows itself by
Phillip J. Eby5d86bdb2006-07-10 19:03:29 +0000510 modulesbyfile[f] = modulesbyfile[
511 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000512 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000513 return sys.modules.get(modulesbyfile[file])
Nick Coghlanc495c662006-09-07 10:50:34 +0000514 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000515 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000516 if not hasattr(object, '__name__'):
517 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000518 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000519 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000520 if mainobject is object:
521 return main
Nick Coghlanc495c662006-09-07 10:50:34 +0000522 # Check builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000523 builtin = sys.modules['__builtin__']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000524 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000525 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000526 if builtinobject is object:
527 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000528
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000529def findsource(object):
530 """Return the entire source file and starting line number for an object.
531
532 The argument may be a module, class, method, function, traceback, frame,
533 or code object. The source code is returned as a list of all the lines
534 in the file and the line number indexes a line in that list. An IOError
535 is raised if the source code cannot be retrieved."""
Benjamin Peterson0eb4ac42011-06-11 15:53:11 -0500536
537 file = getfile(object)
538 sourcefile = getsourcefile(object)
539 if not sourcefile and file[0] + file[-1] != '<>':
R. David Murray996ba022009-05-13 17:14:11 +0000540 raise IOError('source code not available')
Benjamin Peterson0eb4ac42011-06-11 15:53:11 -0500541 file = sourcefile if sourcefile else file
542
Nick Coghlanc495c662006-09-07 10:50:34 +0000543 module = getmodule(object, file)
Georg Brandl208badd2006-04-30 17:42:26 +0000544 if module:
545 lines = linecache.getlines(file, module.__dict__)
546 else:
547 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000548 if not lines:
Jeremy Hyltonab919022003-06-27 18:41:20 +0000549 raise IOError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000550
551 if ismodule(object):
552 return lines, 0
553
554 if isclass(object):
555 name = object.__name__
Georg Brandlb2e81e32006-10-12 09:20:33 +0000556 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
557 # make some effort to find the best matching class definition:
558 # use the one with the least indentation, which is the one
559 # that's most probably not inside a function definition.
560 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000561 for i in range(len(lines)):
Georg Brandlb2e81e32006-10-12 09:20:33 +0000562 match = pat.match(lines[i])
563 if match:
564 # if it's at toplevel, it's already the best one
565 if lines[i][0] == 'c':
566 return lines, i
567 # else add whitespace to candidate list
568 candidates.append((match.group(1), i))
569 if candidates:
570 # this will sort by whitespace, and by line number,
571 # less whitespace first
572 candidates.sort()
573 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000574 else:
575 raise IOError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000576
577 if ismethod(object):
578 object = object.im_func
579 if isfunction(object):
580 object = object.func_code
581 if istraceback(object):
582 object = object.tb_frame
583 if isframe(object):
584 object = object.f_code
585 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000586 if not hasattr(object, 'co_firstlineno'):
Jeremy Hyltonab919022003-06-27 18:41:20 +0000587 raise IOError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000588 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000589 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000590 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000591 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000592 lnum = lnum - 1
593 return lines, lnum
Jeremy Hyltonab919022003-06-27 18:41:20 +0000594 raise IOError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000595
596def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000597 """Get lines of comments immediately preceding an object's source code.
598
599 Returns None when source can't be found.
600 """
601 try:
602 lines, lnum = findsource(object)
603 except (IOError, TypeError):
604 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000605
606 if ismodule(object):
607 # Look for a comment block at the top of the file.
608 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000609 if lines and lines[0][:2] == '#!': start = 1
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000610 while start < len(lines) and string.strip(lines[start]) in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000611 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000612 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000613 comments = []
614 end = start
615 while end < len(lines) and lines[end][:1] == '#':
616 comments.append(string.expandtabs(lines[end]))
617 end = end + 1
618 return string.join(comments, '')
619
620 # Look for a preceding block of comments at the same indentation.
621 elif lnum > 0:
622 indent = indentsize(lines[lnum])
623 end = lnum - 1
624 if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \
625 indentsize(lines[end]) == indent:
626 comments = [string.lstrip(string.expandtabs(lines[end]))]
627 if end > 0:
628 end = end - 1
629 comment = string.lstrip(string.expandtabs(lines[end]))
630 while comment[:1] == '#' and indentsize(lines[end]) == indent:
631 comments[:0] = [comment]
632 end = end - 1
633 if end < 0: break
634 comment = string.lstrip(string.expandtabs(lines[end]))
635 while comments and string.strip(comments[0]) == '#':
636 comments[:1] = []
637 while comments and string.strip(comments[-1]) == '#':
638 comments[-1:] = []
639 return string.join(comments, '')
640
Tim Peters4efb6e92001-06-29 23:51:08 +0000641class EndOfBlock(Exception): pass
642
643class BlockFinder:
644 """Provide a tokeneater() method to detect the end of a code block."""
645 def __init__(self):
646 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000647 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000648 self.started = False
649 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000650 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000651
Brett Cannonf5eb2ff2008-08-01 01:40:24 +0000652 def tokeneater(self, type, token, srow_scol, erow_ecol, line):
653 srow, scol = srow_scol
654 erow, ecol = erow_ecol
Tim Peters4efb6e92001-06-29 23:51:08 +0000655 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000656 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000657 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000658 if token == "lambda":
659 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000660 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000661 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000662 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000663 self.passline = False # stop skipping when a NEWLINE is seen
Tim Peters4efb6e92001-06-29 23:51:08 +0000664 self.last = srow
Armin Rigodd5c0232005-09-25 11:45:45 +0000665 if self.islambda: # lambdas always end at the first NEWLINE
666 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000667 elif self.passline:
668 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000669 elif type == tokenize.INDENT:
670 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000671 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000672 elif type == tokenize.DEDENT:
673 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000674 # the end of matching indent/dedent pairs end a block
675 # (note that this only works for "def"/"class" blocks,
676 # not e.g. for "if: else:" or "try: finally:" blocks)
677 if self.indent <= 0:
678 raise EndOfBlock
679 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
680 # any other token on the same indentation level end the previous
681 # block as well, except the pseudo-tokens COMMENT and NL.
682 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000683
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000684def getblock(lines):
685 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000686 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000687 try:
Armin Rigodd5c0232005-09-25 11:45:45 +0000688 tokenize.tokenize(iter(lines).next, blockfinder.tokeneater)
689 except (EndOfBlock, IndentationError):
690 pass
691 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000692
693def getsourcelines(object):
694 """Return a list of source lines and starting line number for an object.
695
696 The argument may be a module, class, method, function, traceback, frame,
697 or code object. The source code is returned as a list of the lines
698 corresponding to the object and the line number indicates where in the
699 original source file the first line of code was found. An IOError is
700 raised if the source code cannot be retrieved."""
701 lines, lnum = findsource(object)
702
703 if ismodule(object): return lines, 0
704 else: return getblock(lines[lnum:]), lnum + 1
705
706def getsource(object):
707 """Return the text of the source code for an object.
708
709 The argument may be a module, class, method, function, traceback, frame,
710 or code object. The source code is returned as a single string. An
711 IOError is raised if the source code cannot be retrieved."""
712 lines, lnum = getsourcelines(object)
713 return string.join(lines, '')
714
715# --------------------------------------------------- class tree extraction
716def walktree(classes, children, parent):
717 """Recursive helper function for getclasstree()."""
718 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000719 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000720 for c in classes:
721 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000722 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000723 results.append(walktree(children[c], children, c))
724 return results
725
726def getclasstree(classes, unique=0):
727 """Arrange the given list of classes into a hierarchy of nested lists.
728
729 Where a nested list appears, it contains classes derived from the class
730 whose entry immediately precedes the list. Each entry is a 2-tuple
731 containing a class and a tuple of its base classes. If the 'unique'
732 argument is true, exactly one entry appears in the returned structure
733 for each class in the given list. Otherwise, classes using multiple
734 inheritance and their descendants will appear multiple times."""
735 children = {}
736 roots = []
737 for c in classes:
738 if c.__bases__:
739 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000740 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000741 children[parent] = []
742 children[parent].append(c)
743 if unique and parent in classes: break
744 elif c not in roots:
745 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000746 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000747 if parent not in classes:
748 roots.append(parent)
749 return walktree(roots, children, None)
750
751# ------------------------------------------------ argument list extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000752Arguments = namedtuple('Arguments', 'args varargs keywords')
753
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000754def getargs(co):
755 """Get information about the arguments accepted by a code object.
756
757 Three things are returned: (args, varargs, varkw), where 'args' is
758 a list of argument names (possibly containing nested lists), and
759 'varargs' and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000760
761 if not iscode(co):
Georg Brandlb0199512009-09-18 13:57:11 +0000762 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000763
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000764 nargs = co.co_argcount
765 names = co.co_varnames
766 args = list(names[:nargs])
767 step = 0
768
769 # The following acrobatics are for anonymous (tuple) arguments.
770 for i in range(nargs):
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000771 if args[i][:1] in ('', '.'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000772 stack, remain, count = [], [], []
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000773 while step < len(co.co_code):
774 op = ord(co.co_code[step])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000775 step = step + 1
776 if op >= dis.HAVE_ARGUMENT:
777 opname = dis.opname[op]
Georg Brandlbc5fbd92007-07-12 08:11:29 +0000778 value = ord(co.co_code[step]) + ord(co.co_code[step+1])*256
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000779 step = step + 2
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000780 if opname in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000781 remain.append(value)
782 count.append(value)
783 elif opname == 'STORE_FAST':
784 stack.append(names[value])
Matthias Klose2e829c02004-08-15 17:04:33 +0000785
786 # Special case for sublists of length 1: def foo((bar))
787 # doesn't generate the UNPACK_TUPLE bytecode, so if
788 # `remain` is empty here, we have such a sublist.
789 if not remain:
790 stack[0] = [stack[0]]
791 break
792 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000793 remain[-1] = remain[-1] - 1
Matthias Klose2e829c02004-08-15 17:04:33 +0000794 while remain[-1] == 0:
795 remain.pop()
796 size = count.pop()
797 stack[-size:] = [stack[-size:]]
798 if not remain: break
799 remain[-1] = remain[-1] - 1
800 if not remain: break
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000801 args[i] = stack[0]
802
803 varargs = None
804 if co.co_flags & CO_VARARGS:
805 varargs = co.co_varnames[nargs]
806 nargs = nargs + 1
807 varkw = None
808 if co.co_flags & CO_VARKEYWORDS:
809 varkw = co.co_varnames[nargs]
Raymond Hettingere896acc2008-01-11 03:04:50 +0000810 return Arguments(args, varargs, varkw)
811
812ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000813
814def getargspec(func):
815 """Get the names and default values of a function's arguments.
816
817 A tuple of four things is returned: (args, varargs, varkw, defaults).
818 'args' is a list of the argument names (it may contain nested lists).
819 'varargs' and 'varkw' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000820 'defaults' is an n-tuple of the default values of the last n arguments.
821 """
822
823 if ismethod(func):
824 func = func.im_func
825 if not isfunction(func):
Georg Brandlb0199512009-09-18 13:57:11 +0000826 raise TypeError('{!r} is not a Python function'.format(func))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000827 args, varargs, varkw = getargs(func.func_code)
Raymond Hettingere896acc2008-01-11 03:04:50 +0000828 return ArgSpec(args, varargs, varkw, func.func_defaults)
829
830ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000831
832def getargvalues(frame):
833 """Get information about arguments passed into a particular frame.
834
835 A tuple of four things is returned: (args, varargs, varkw, locals).
836 'args' is a list of the argument names (it may contain nested lists).
837 'varargs' and 'varkw' are the names of the * and ** arguments or None.
838 'locals' is the locals dictionary of the given frame."""
839 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson4d9b0cd2008-10-21 22:18:29 +0000840 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000841
842def joinseq(seq):
843 if len(seq) == 1:
844 return '(' + seq[0] + ',)'
845 else:
846 return '(' + string.join(seq, ', ') + ')'
847
848def strseq(object, convert, join=joinseq):
849 """Recursively walk a sequence, stringifying each element."""
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000850 if type(object) in (list, tuple):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000851 return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
852 else:
853 return convert(object)
854
855def formatargspec(args, varargs=None, varkw=None, defaults=None,
856 formatarg=str,
857 formatvarargs=lambda name: '*' + name,
858 formatvarkw=lambda name: '**' + name,
859 formatvalue=lambda value: '=' + repr(value),
860 join=joinseq):
861 """Format an argument spec from the 4 values returned by getargspec.
862
863 The first four arguments are (args, varargs, varkw, defaults). The
864 other four arguments are the corresponding optional formatting functions
865 that are called to turn names and values into strings. The ninth
866 argument is an optional function to format the sequence of arguments."""
867 specs = []
868 if defaults:
869 firstdefault = len(args) - len(defaults)
Benjamin Peterson9109f912009-01-17 04:28:57 +0000870 for i, arg in enumerate(args):
871 spec = strseq(arg, formatarg, join)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000872 if defaults and i >= firstdefault:
873 spec = spec + formatvalue(defaults[i - firstdefault])
874 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +0000875 if varargs is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000876 specs.append(formatvarargs(varargs))
Raymond Hettinger936654b2002-06-01 03:06:31 +0000877 if varkw is not None:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000878 specs.append(formatvarkw(varkw))
879 return '(' + string.join(specs, ', ') + ')'
880
881def formatargvalues(args, varargs, varkw, locals,
882 formatarg=str,
883 formatvarargs=lambda name: '*' + name,
884 formatvarkw=lambda name: '**' + name,
885 formatvalue=lambda value: '=' + repr(value),
886 join=joinseq):
887 """Format an argument spec from the 4 values returned by getargvalues.
888
889 The first four arguments are (args, varargs, varkw, locals). The
890 next four arguments are the corresponding optional formatting functions
891 that are called to turn names and values into strings. The ninth
892 argument is an optional function to format the sequence of arguments."""
893 def convert(name, locals=locals,
894 formatarg=formatarg, formatvalue=formatvalue):
895 return formatarg(name) + formatvalue(locals[name])
896 specs = []
897 for i in range(len(args)):
898 specs.append(strseq(args[i], convert, join))
899 if varargs:
900 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
901 if varkw:
902 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
903 return '(' + string.join(specs, ', ') + ')'
904
Benjamin Peterson7e213252010-03-30 17:58:13 +0000905def getcallargs(func, *positional, **named):
906 """Get the mapping of arguments to values.
907
908 A dict is returned, with keys the function argument names (including the
909 names of the * and ** arguments, if any), and values the respective bound
910 values from 'positional' and 'named'."""
911 args, varargs, varkw, defaults = getargspec(func)
912 f_name = func.__name__
913 arg2value = {}
914
915 # The following closures are basically because of tuple parameter unpacking.
916 assigned_tuple_params = []
917 def assign(arg, value):
918 if isinstance(arg, str):
919 arg2value[arg] = value
920 else:
921 assigned_tuple_params.append(arg)
922 value = iter(value)
923 for i, subarg in enumerate(arg):
924 try:
925 subvalue = next(value)
926 except StopIteration:
927 raise ValueError('need more than %d %s to unpack' %
928 (i, 'values' if i > 1 else 'value'))
929 assign(subarg,subvalue)
930 try:
931 next(value)
932 except StopIteration:
933 pass
934 else:
935 raise ValueError('too many values to unpack')
936 def is_assigned(arg):
937 if isinstance(arg,str):
938 return arg in arg2value
939 return arg in assigned_tuple_params
940 if ismethod(func) and func.im_self is not None:
941 # implicit 'self' (or 'cls' for classmethods) argument
942 positional = (func.im_self,) + positional
943 num_pos = len(positional)
944 num_total = num_pos + len(named)
945 num_args = len(args)
946 num_defaults = len(defaults) if defaults else 0
947 for arg, value in zip(args, positional):
948 assign(arg, value)
949 if varargs:
950 if num_pos > num_args:
951 assign(varargs, positional[-(num_pos-num_args):])
952 else:
953 assign(varargs, ())
954 elif 0 < num_args < num_pos:
955 raise TypeError('%s() takes %s %d %s (%d given)' % (
956 f_name, 'at most' if defaults else 'exactly', num_args,
957 'arguments' if num_args > 1 else 'argument', num_total))
958 elif num_args == 0 and num_total:
Benjamin Peterson77d46602011-03-28 17:32:31 -0500959 if varkw:
960 if num_pos:
961 # XXX: We should use num_pos, but Python also uses num_total:
962 raise TypeError('%s() takes exactly 0 arguments '
963 '(%d given)' % (f_name, num_total))
964 else:
965 raise TypeError('%s() takes no arguments (%d given)' %
966 (f_name, num_total))
Benjamin Peterson7e213252010-03-30 17:58:13 +0000967 for arg in args:
968 if isinstance(arg, str) and arg in named:
969 if is_assigned(arg):
970 raise TypeError("%s() got multiple values for keyword "
971 "argument '%s'" % (f_name, arg))
972 else:
973 assign(arg, named.pop(arg))
974 if defaults: # fill in any missing values with the defaults
975 for arg, value in zip(args[-num_defaults:], defaults):
976 if not is_assigned(arg):
977 assign(arg, value)
978 if varkw:
979 assign(varkw, named)
980 elif named:
981 unexpected = next(iter(named))
982 if isinstance(unexpected, unicode):
983 unexpected = unexpected.encode(sys.getdefaultencoding(), 'replace')
984 raise TypeError("%s() got an unexpected keyword argument '%s'" %
985 (f_name, unexpected))
986 unassigned = num_args - len([arg for arg in args if is_assigned(arg)])
987 if unassigned:
988 num_required = num_args - num_defaults
989 raise TypeError('%s() takes %s %d %s (%d given)' % (
990 f_name, 'at least' if defaults else 'exactly', num_required,
991 'arguments' if num_required > 1 else 'argument', num_total))
992 return arg2value
993
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000994# -------------------------------------------------- stack frame extraction
Raymond Hettingere896acc2008-01-11 03:04:50 +0000995
996Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
997
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000998def getframeinfo(frame, context=1):
999 """Get information about a frame or traceback object.
1000
1001 A tuple of five things is returned: the filename, the line number of
1002 the current line, the function name, a list of lines of context from
1003 the source code, and the index of the current line within that list.
1004 The optional second argument specifies the number of lines of context
1005 to return, which are centered around the current line."""
1006 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001007 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001008 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001009 else:
1010 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001011 if not isframe(frame):
Georg Brandlb0199512009-09-18 13:57:11 +00001012 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001013
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001014 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001015 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001016 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001017 try:
1018 lines, lnum = findsource(frame)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001019 except IOError:
1020 lines = index = None
1021 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001022 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001023 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001024 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001025 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001026 else:
1027 lines = index = None
1028
Raymond Hettingere896acc2008-01-11 03:04:50 +00001029 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001030
1031def getlineno(frame):
1032 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001033 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1034 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001035
1036def getouterframes(frame, context=1):
1037 """Get a list of records for a frame and all higher (calling) frames.
1038
1039 Each record contains a frame object, filename, line number, function
1040 name, a list of lines of context, and index within the context."""
1041 framelist = []
1042 while frame:
1043 framelist.append((frame,) + getframeinfo(frame, context))
1044 frame = frame.f_back
1045 return framelist
1046
1047def getinnerframes(tb, context=1):
1048 """Get a list of records for a traceback's frame and all lower 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."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001052 framelist = []
1053 while tb:
1054 framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
1055 tb = tb.tb_next
1056 return framelist
1057
Michael Foordfb0e0572009-07-26 21:12:14 +00001058if hasattr(sys, '_getframe'):
1059 currentframe = sys._getframe
1060else:
1061 currentframe = lambda _=None: None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001062
1063def stack(context=1):
1064 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001065 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001066
1067def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001068 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001069 return getinnerframes(sys.exc_info()[2], context)