blob: 1e94a9c539b9f91a40f9a279835edd489da3f303 [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
Yury Selivanov0cf3ed62014-04-01 10:17:08 -040020 getfullargspec() - same, with support for Python 3 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
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070025
26 signature() - get a Signature object for the callable
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000027"""
28
29# This module is in the public domain. No warranties.
30
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070031__author__ = ('Ka-Ping Yee <ping@lfw.org>',
32 'Yury Selivanov <yselivanov@sprymix.com>')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000033
Larry Hastings44e2eaa2013-11-23 15:37:55 -080034import ast
Antoine Pitroua8723a02015-04-15 00:41:29 +020035import dis
Yury Selivanov75445082015-05-11 22:57:16 -040036import collections.abc
Yury Selivanov21e83a52014-03-27 11:23:13 -040037import enum
Brett Cannoncb66eb02012-05-11 12:58:42 -040038import importlib.machinery
39import itertools
Christian Heimes7131fd92008-02-19 14:21:46 +000040import linecache
Brett Cannoncb66eb02012-05-11 12:58:42 -040041import os
42import re
43import sys
44import tokenize
Larry Hastings2623c8c2014-02-08 22:15:29 -080045import token
Brett Cannoncb66eb02012-05-11 12:58:42 -040046import types
Brett Cannon2b88fcf2012-06-02 22:28:42 -040047import warnings
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070048import functools
Nick Coghlan2f92e542012-06-23 19:39:55 +100049import builtins
Raymond Hettingera1a992c2005-03-11 06:46:45 +000050from operator import attrgetter
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070051from collections import namedtuple, OrderedDict
Nick Coghlan09c81232010-08-17 10:18:16 +000052
53# Create constants for the compiler flags in Include/code.h
Antoine Pitroua8723a02015-04-15 00:41:29 +020054# We try to get them from dis to avoid duplication
55mod_dict = globals()
56for k, v in dis.COMPILER_FLAG_NAMES.items():
57 mod_dict["CO_" + v] = k
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000058
Christian Heimesbe5b30b2008-03-03 19:18:51 +000059# See Include/object.h
60TPFLAGS_IS_ABSTRACT = 1 << 20
61
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000062# ----------------------------------------------------------- type-checking
63def ismodule(object):
64 """Return true if the object is a module.
65
66 Module objects provide these attributes:
Barry Warsaw28a691b2010-04-17 00:19:56 +000067 __cached__ pathname to byte compiled file
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000068 __doc__ documentation string
69 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000070 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000071
72def isclass(object):
73 """Return true if the object is a class.
74
75 Class objects provide these attributes:
76 __doc__ documentation string
77 __module__ name of module in which this class was defined"""
Benjamin Petersonc4656002009-01-17 22:41:18 +000078 return isinstance(object, type)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000079
80def ismethod(object):
81 """Return true if the object is an instance method.
82
83 Instance method objects provide these attributes:
84 __doc__ documentation string
85 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000086 __func__ function object containing implementation of method
87 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000088 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000089
Tim Peters536d2262001-09-20 05:13:38 +000090def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000091 """Return true if the object is a method descriptor.
92
93 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +000094
95 This is new in Python 2.2, and, for example, is true of int.__add__.
96 An object passing this test has a __get__ attribute but not a __set__
97 attribute, but beyond that the set of attributes varies. __name__ is
98 usually sensible, and __doc__ often is.
99
Tim Petersf1d90b92001-09-20 05:47:55 +0000100 Methods implemented via descriptors that also pass one of the other
101 tests return false from the ismethoddescriptor() test, simply because
102 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +0000103 __func__ attribute (etc) when an object passes ismethod()."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100104 if isclass(object) or ismethod(object) or isfunction(object):
105 # mutual exclusion
106 return False
107 tp = type(object)
108 return hasattr(tp, "__get__") and not hasattr(tp, "__set__")
Tim Peters536d2262001-09-20 05:13:38 +0000109
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000110def isdatadescriptor(object):
111 """Return true if the object is a data descriptor.
112
113 Data descriptors have both a __get__ and a __set__ attribute. Examples are
114 properties (defined in Python) and getsets and members (defined in C).
115 Typically, data descriptors will also have __name__ and __doc__ attributes
116 (properties, getsets, and members have both of these attributes), but this
117 is not guaranteed."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100118 if isclass(object) or ismethod(object) or isfunction(object):
119 # mutual exclusion
120 return False
121 tp = type(object)
122 return hasattr(tp, "__set__") and hasattr(tp, "__get__")
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000123
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000124if hasattr(types, 'MemberDescriptorType'):
125 # CPython and equivalent
126 def ismemberdescriptor(object):
127 """Return true if the object is a member descriptor.
128
129 Member descriptors are specialized descriptors defined in extension
130 modules."""
131 return isinstance(object, types.MemberDescriptorType)
132else:
133 # Other implementations
134 def ismemberdescriptor(object):
135 """Return true if the object is a member descriptor.
136
137 Member descriptors are specialized descriptors defined in extension
138 modules."""
139 return False
140
141if hasattr(types, 'GetSetDescriptorType'):
142 # CPython and equivalent
143 def isgetsetdescriptor(object):
144 """Return true if the object is a getset descriptor.
145
146 getset descriptors are specialized descriptors defined in extension
147 modules."""
148 return isinstance(object, types.GetSetDescriptorType)
149else:
150 # Other implementations
151 def isgetsetdescriptor(object):
152 """Return true if the object is a getset descriptor.
153
154 getset descriptors are specialized descriptors defined in extension
155 modules."""
156 return False
157
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000158def isfunction(object):
159 """Return true if the object is a user-defined function.
160
161 Function objects provide these attributes:
162 __doc__ documentation string
163 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000164 __code__ code object containing compiled function bytecode
165 __defaults__ tuple of any default values for arguments
166 __globals__ global namespace in which this function was defined
167 __annotations__ dict of parameter annotations
168 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000169 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000170
Christian Heimes7131fd92008-02-19 14:21:46 +0000171def isgeneratorfunction(object):
172 """Return true if the object is a user-defined generator function.
173
174 Generator function objects provides same attributes as functions.
175
Alexander Belopolsky977a6842010-08-16 20:17:07 +0000176 See help(isfunction) for attributes listing."""
Georg Brandlb1441c72009-01-03 22:33:39 +0000177 return bool((isfunction(object) or ismethod(object)) and
Yury Selivanov5376ba92015-06-22 12:19:30 -0400178 object.__code__.co_flags & CO_GENERATOR)
Yury Selivanov75445082015-05-11 22:57:16 -0400179
180def iscoroutinefunction(object):
181 """Return true if the object is a coroutine function.
182
183 Coroutine functions are defined with "async def" syntax,
184 or generators decorated with "types.coroutine".
185 """
186 return bool((isfunction(object) or ismethod(object)) and
Yury Selivanov5376ba92015-06-22 12:19:30 -0400187 object.__code__.co_flags & CO_COROUTINE)
Yury Selivanov75445082015-05-11 22:57:16 -0400188
Christian Heimes7131fd92008-02-19 14:21:46 +0000189def isgenerator(object):
190 """Return true if the object is a generator.
191
192 Generator objects provide these attributes:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300193 __iter__ defined to support iteration over container
Christian Heimes7131fd92008-02-19 14:21:46 +0000194 close raises a new GeneratorExit exception inside the
195 generator to terminate the iteration
196 gi_code code object
197 gi_frame frame object or possibly None once the generator has
198 been exhausted
199 gi_running set to 1 when generator is executing, 0 otherwise
200 next return the next item from the container
201 send resumes the generator and "sends" a value that becomes
202 the result of the current yield-expression
203 throw used to raise an exception inside the generator"""
Yury Selivanov5376ba92015-06-22 12:19:30 -0400204 return isinstance(object, types.GeneratorType)
Yury Selivanov75445082015-05-11 22:57:16 -0400205
206def iscoroutine(object):
207 """Return true if the object is a coroutine."""
Yury Selivanov5376ba92015-06-22 12:19:30 -0400208 return isinstance(object, types.CoroutineType)
Christian Heimes7131fd92008-02-19 14:21:46 +0000209
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -0400210def isawaitable(object):
211 """Return true is object can be passed to an ``await`` expression."""
212 return (isinstance(object, types.CoroutineType) or
213 isinstance(object, types.GeneratorType) and
214 object.gi_code.co_flags & CO_ITERABLE_COROUTINE or
215 isinstance(object, collections.abc.Awaitable))
216
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000217def istraceback(object):
218 """Return true if the object is a traceback.
219
220 Traceback objects provide these attributes:
221 tb_frame frame object at this level
222 tb_lasti index of last attempted instruction in bytecode
223 tb_lineno current line number in Python source code
224 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000225 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000226
227def isframe(object):
228 """Return true if the object is a frame object.
229
230 Frame objects provide these attributes:
231 f_back next outer frame object (this frame's caller)
232 f_builtins built-in namespace seen by this frame
233 f_code code object being executed in this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000234 f_globals global namespace seen by this frame
235 f_lasti index of last attempted instruction in bytecode
236 f_lineno current line number in Python source code
237 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000238 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000239 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000240
241def iscode(object):
242 """Return true if the object is a code object.
243
244 Code objects provide these attributes:
245 co_argcount number of arguments (not including * or ** args)
246 co_code string of raw compiled bytecode
247 co_consts tuple of constants used in the bytecode
248 co_filename name of file in which this code object was created
249 co_firstlineno number of first line in Python source code
250 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
251 co_lnotab encoded mapping of line numbers to bytecode indices
252 co_name name with which this code object was defined
253 co_names tuple of names of local variables
254 co_nlocals number of local variables
255 co_stacksize virtual machine stack space required
256 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000257 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000258
259def isbuiltin(object):
260 """Return true if the object is a built-in function or method.
261
262 Built-in functions and methods provide these attributes:
263 __doc__ documentation string
264 __name__ original name of this function or method
265 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000266 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000267
268def isroutine(object):
269 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000270 return (isbuiltin(object)
271 or isfunction(object)
272 or ismethod(object)
273 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000274
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000275def isabstract(object):
276 """Return true if the object is an abstract base class (ABC)."""
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000277 return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT)
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000278
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000279def getmembers(object, predicate=None):
280 """Return all members of an object as (name, value) pairs sorted by name.
281 Optionally, only return members that satisfy a given predicate."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100282 if isclass(object):
283 mro = (object,) + getmro(object)
284 else:
285 mro = ()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000286 results = []
Ethan Furmane03ea372013-09-25 07:14:41 -0700287 processed = set()
288 names = dir(object)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700289 # :dd any DynamicClassAttributes to the list of names if object is a class;
Ethan Furmane03ea372013-09-25 07:14:41 -0700290 # this may result in duplicate entries if, for example, a virtual
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700291 # attribute with the same name as a DynamicClassAttribute exists
Ethan Furmane03ea372013-09-25 07:14:41 -0700292 try:
293 for base in object.__bases__:
294 for k, v in base.__dict__.items():
295 if isinstance(v, types.DynamicClassAttribute):
296 names.append(k)
297 except AttributeError:
298 pass
299 for key in names:
Ethan Furman63c141c2013-10-18 00:27:39 -0700300 # First try to get the value via getattr. Some descriptors don't
301 # like calling their __get__ (see bug #1785), so fall back to
302 # looking in the __dict__.
303 try:
304 value = getattr(object, key)
305 # handle the duplicate key
306 if key in processed:
307 raise AttributeError
308 except AttributeError:
309 for base in mro:
310 if key in base.__dict__:
311 value = base.__dict__[key]
312 break
313 else:
314 # could be a (currently) missing slot member, or a buggy
315 # __dir__; discard and move on
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100316 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000317 if not predicate or predicate(value):
318 results.append((key, value))
Ethan Furmane03ea372013-09-25 07:14:41 -0700319 processed.add(key)
320 results.sort(key=lambda pair: pair[0])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000321 return results
322
Christian Heimes25bb7832008-01-11 16:17:00 +0000323Attribute = namedtuple('Attribute', 'name kind defining_class object')
324
Tim Peters13b49d32001-09-23 02:00:29 +0000325def classify_class_attrs(cls):
326 """Return list of attribute-descriptor tuples.
327
328 For each name in dir(cls), the return list contains a 4-tuple
329 with these elements:
330
331 0. The name (a string).
332
333 1. The kind of attribute this is, one of these strings:
334 'class method' created via classmethod()
335 'static method' created via staticmethod()
336 'property' created via property()
Ethan Furmane03ea372013-09-25 07:14:41 -0700337 'method' any other flavor of method or descriptor
Tim Peters13b49d32001-09-23 02:00:29 +0000338 'data' not a method
339
340 2. The class which defined this attribute (a class).
341
Ethan Furmane03ea372013-09-25 07:14:41 -0700342 3. The object as obtained by calling getattr; if this fails, or if the
343 resulting object does not live anywhere in the class' mro (including
344 metaclasses) then the object is looked up in the defining class's
345 dict (found by walking the mro).
Ethan Furman668dede2013-09-14 18:53:26 -0700346
347 If one of the items in dir(cls) is stored in the metaclass it will now
348 be discovered and not have None be listed as the class in which it was
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700349 defined. Any items whose home class cannot be discovered are skipped.
Tim Peters13b49d32001-09-23 02:00:29 +0000350 """
351
352 mro = getmro(cls)
Ethan Furman668dede2013-09-14 18:53:26 -0700353 metamro = getmro(type(cls)) # for attributes stored in the metaclass
Ethan Furmane03ea372013-09-25 07:14:41 -0700354 metamro = tuple([cls for cls in metamro if cls not in (type, object)])
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700355 class_bases = (cls,) + mro
356 all_bases = class_bases + metamro
Tim Peters13b49d32001-09-23 02:00:29 +0000357 names = dir(cls)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700358 # :dd any DynamicClassAttributes to the list of names;
Ethan Furmane03ea372013-09-25 07:14:41 -0700359 # this may result in duplicate entries if, for example, a virtual
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700360 # attribute with the same name as a DynamicClassAttribute exists.
Ethan Furman63c141c2013-10-18 00:27:39 -0700361 for base in mro:
Ethan Furmane03ea372013-09-25 07:14:41 -0700362 for k, v in base.__dict__.items():
363 if isinstance(v, types.DynamicClassAttribute):
364 names.append(k)
Tim Peters13b49d32001-09-23 02:00:29 +0000365 result = []
Ethan Furmane03ea372013-09-25 07:14:41 -0700366 processed = set()
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700367
Tim Peters13b49d32001-09-23 02:00:29 +0000368 for name in names:
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100369 # Get the object associated with the name, and where it was defined.
Ethan Furmane03ea372013-09-25 07:14:41 -0700370 # Normal objects will be looked up with both getattr and directly in
371 # its class' dict (in case getattr fails [bug #1785], and also to look
372 # for a docstring).
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700373 # For DynamicClassAttributes on the second pass we only look in the
Ethan Furmane03ea372013-09-25 07:14:41 -0700374 # class's dict.
375 #
Tim Peters13b49d32001-09-23 02:00:29 +0000376 # Getting an obj from the __dict__ sometimes reveals more than
377 # using getattr. Static and class methods are dramatic examples.
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100378 homecls = None
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700379 get_obj = None
380 dict_obj = None
Ethan Furmane03ea372013-09-25 07:14:41 -0700381 if name not in processed:
382 try:
Ethan Furmana8b07072013-10-18 01:22:08 -0700383 if name == '__dict__':
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700384 raise Exception("__dict__ is special, don't want the proxy")
Ethan Furmane03ea372013-09-25 07:14:41 -0700385 get_obj = getattr(cls, name)
386 except Exception as exc:
387 pass
388 else:
Ethan Furmane03ea372013-09-25 07:14:41 -0700389 homecls = getattr(get_obj, "__objclass__", homecls)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700390 if homecls not in class_bases:
Ethan Furmane03ea372013-09-25 07:14:41 -0700391 # if the resulting object does not live somewhere in the
Ethan Furman63c141c2013-10-18 00:27:39 -0700392 # mro, drop it and search the mro manually
Ethan Furmane03ea372013-09-25 07:14:41 -0700393 homecls = None
Ethan Furman63c141c2013-10-18 00:27:39 -0700394 last_cls = None
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700395 # first look in the classes
396 for srch_cls in class_bases:
Ethan Furman63c141c2013-10-18 00:27:39 -0700397 srch_obj = getattr(srch_cls, name, None)
Yury Selivanovbf341fb2015-05-21 15:41:57 -0400398 if srch_obj is get_obj:
Ethan Furman63c141c2013-10-18 00:27:39 -0700399 last_cls = srch_cls
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700400 # then check the metaclasses
401 for srch_cls in metamro:
402 try:
403 srch_obj = srch_cls.__getattr__(cls, name)
404 except AttributeError:
405 continue
Yury Selivanovbf341fb2015-05-21 15:41:57 -0400406 if srch_obj is get_obj:
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700407 last_cls = srch_cls
Ethan Furman63c141c2013-10-18 00:27:39 -0700408 if last_cls is not None:
409 homecls = last_cls
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700410 for base in all_bases:
Ethan Furmane03ea372013-09-25 07:14:41 -0700411 if name in base.__dict__:
412 dict_obj = base.__dict__[name]
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700413 if homecls not in metamro:
414 homecls = base
Ethan Furmane03ea372013-09-25 07:14:41 -0700415 break
Ethan Furman63c141c2013-10-18 00:27:39 -0700416 if homecls is None:
417 # unable to locate the attribute anywhere, most likely due to
418 # buggy custom __dir__; discard and move on
419 continue
Yury Selivanovbf341fb2015-05-21 15:41:57 -0400420 obj = get_obj if get_obj is not None else dict_obj
Ethan Furmane03ea372013-09-25 07:14:41 -0700421 # Classify the object or its descriptor.
Ethan Furman63c141c2013-10-18 00:27:39 -0700422 if isinstance(dict_obj, staticmethod):
Tim Peters13b49d32001-09-23 02:00:29 +0000423 kind = "static method"
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700424 obj = dict_obj
Ethan Furman63c141c2013-10-18 00:27:39 -0700425 elif isinstance(dict_obj, classmethod):
Tim Peters13b49d32001-09-23 02:00:29 +0000426 kind = "class method"
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700427 obj = dict_obj
428 elif isinstance(dict_obj, property):
Tim Peters13b49d32001-09-23 02:00:29 +0000429 kind = "property"
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700430 obj = dict_obj
Yury Selivanov0860a0b2014-01-31 14:28:44 -0500431 elif isroutine(obj):
Tim Peters13b49d32001-09-23 02:00:29 +0000432 kind = "method"
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100433 else:
Ethan Furmane03ea372013-09-25 07:14:41 -0700434 kind = "data"
Christian Heimes25bb7832008-01-11 16:17:00 +0000435 result.append(Attribute(name, kind, homecls, obj))
Ethan Furmane03ea372013-09-25 07:14:41 -0700436 processed.add(name)
Tim Peters13b49d32001-09-23 02:00:29 +0000437 return result
438
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000439# ----------------------------------------------------------- class helpers
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000440
441def getmro(cls):
442 "Return tuple of base classes (including cls) in method resolution order."
Benjamin Petersonb82c8e52010-11-04 00:38:49 +0000443 return cls.__mro__
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000444
Nick Coghlane8c45d62013-07-28 20:00:01 +1000445# -------------------------------------------------------- function helpers
446
447def unwrap(func, *, stop=None):
448 """Get the object wrapped by *func*.
449
450 Follows the chain of :attr:`__wrapped__` attributes returning the last
451 object in the chain.
452
453 *stop* is an optional callback accepting an object in the wrapper chain
454 as its sole argument that allows the unwrapping to be terminated early if
455 the callback returns a true value. If the callback never returns a true
456 value, the last object in the chain is returned as usual. For example,
457 :func:`signature` uses this to stop unwrapping if any object in the
458 chain has a ``__signature__`` attribute defined.
459
460 :exc:`ValueError` is raised if a cycle is encountered.
461
462 """
463 if stop is None:
464 def _is_wrapper(f):
465 return hasattr(f, '__wrapped__')
466 else:
467 def _is_wrapper(f):
468 return hasattr(f, '__wrapped__') and not stop(f)
469 f = func # remember the original func for error reporting
470 memo = {id(f)} # Memoise by id to tolerate non-hashable objects
471 while _is_wrapper(func):
472 func = func.__wrapped__
473 id_func = id(func)
474 if id_func in memo:
475 raise ValueError('wrapper loop when unwrapping {!r}'.format(f))
476 memo.add(id_func)
477 return func
478
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000479# -------------------------------------------------- source code extraction
480def indentsize(line):
481 """Return the indent size, in spaces, at the start of a line of text."""
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000482 expline = line.expandtabs()
483 return len(expline) - len(expline.lstrip())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000484
Serhiy Storchaka5cf2b7252015-04-03 22:38:53 +0300485def _findclass(func):
486 cls = sys.modules.get(func.__module__)
487 if cls is None:
488 return None
489 for name in func.__qualname__.split('.')[:-1]:
490 cls = getattr(cls, name)
491 if not isclass(cls):
492 return None
493 return cls
494
495def _finddoc(obj):
496 if isclass(obj):
497 for base in obj.__mro__:
498 if base is not object:
499 try:
500 doc = base.__doc__
501 except AttributeError:
502 continue
503 if doc is not None:
504 return doc
505 return None
506
507 if ismethod(obj):
508 name = obj.__func__.__name__
509 self = obj.__self__
510 if (isclass(self) and
511 getattr(getattr(self, name, None), '__func__') is obj.__func__):
512 # classmethod
513 cls = self
514 else:
515 cls = self.__class__
516 elif isfunction(obj):
517 name = obj.__name__
518 cls = _findclass(obj)
519 if cls is None or getattr(cls, name) is not obj:
520 return None
521 elif isbuiltin(obj):
522 name = obj.__name__
523 self = obj.__self__
524 if (isclass(self) and
525 self.__qualname__ + '.' + name == obj.__qualname__):
526 # classmethod
527 cls = self
528 else:
529 cls = self.__class__
530 elif ismethoddescriptor(obj) or isdatadescriptor(obj):
531 name = obj.__name__
532 cls = obj.__objclass__
533 if getattr(cls, name) is not obj:
534 return None
535 elif isinstance(obj, property):
536 func = f.fget
537 name = func.__name__
538 cls = _findclass(func)
539 if cls is None or getattr(cls, name) is not obj:
540 return None
541 else:
542 return None
543
544 for base in cls.__mro__:
545 try:
546 doc = getattr(base, name).__doc__
547 except AttributeError:
548 continue
549 if doc is not None:
550 return doc
551 return None
552
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000553def getdoc(object):
554 """Get the documentation string for an object.
555
556 All tabs are expanded to spaces. To clean up docstrings that are
557 indented to line up with blocks of code, any whitespace than can be
558 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000559 try:
560 doc = object.__doc__
561 except AttributeError:
562 return None
Serhiy Storchaka5cf2b7252015-04-03 22:38:53 +0300563 if doc is None:
564 try:
565 doc = _finddoc(object)
566 except (AttributeError, TypeError):
567 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000568 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000569 return None
Georg Brandl0c77a822008-06-10 16:37:50 +0000570 return cleandoc(doc)
571
572def cleandoc(doc):
573 """Clean up indentation from docstrings.
574
575 Any whitespace that can be uniformly removed from the second line
576 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000577 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000578 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000579 except UnicodeError:
580 return None
581 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000582 # Find minimum indentation of any non-blank lines after first line.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000583 margin = sys.maxsize
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000584 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000585 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000586 if content:
587 indent = len(line) - content
588 margin = min(margin, indent)
589 # Remove indentation.
590 if lines:
591 lines[0] = lines[0].lstrip()
Christian Heimesa37d4c62007-12-04 23:02:19 +0000592 if margin < sys.maxsize:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000593 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000594 # Remove any trailing or leading blank lines.
595 while lines and not lines[-1]:
596 lines.pop()
597 while lines and not lines[0]:
598 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000599 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000600
601def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000602 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000603 if ismodule(object):
604 if hasattr(object, '__file__'):
605 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000606 raise TypeError('{!r} is a built-in module'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000607 if isclass(object):
Yury Selivanov2eed8b72014-01-27 13:24:56 -0500608 if hasattr(object, '__module__'):
609 object = sys.modules.get(object.__module__)
610 if hasattr(object, '__file__'):
611 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000612 raise TypeError('{!r} is a built-in class'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000613 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000614 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000615 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000616 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000617 if istraceback(object):
618 object = object.tb_frame
619 if isframe(object):
620 object = object.f_code
621 if iscode(object):
622 return object.co_filename
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000623 raise TypeError('{!r} is not a module, class, method, '
624 'function, traceback, frame, or code object'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000625
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000626def getmodulename(path):
627 """Return the module name for a given file, or None."""
Nick Coghlan76e07702012-07-18 23:14:57 +1000628 fname = os.path.basename(path)
629 # Check for paths that look like an actual module file
630 suffixes = [(-len(suffix), suffix)
631 for suffix in importlib.machinery.all_suffixes()]
632 suffixes.sort() # try longest suffixes first, in case they overlap
633 for neglen, suffix in suffixes:
634 if fname.endswith(suffix):
635 return fname[:neglen]
636 return None
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000637
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000638def getsourcefile(object):
R. David Murraya1b37402010-06-17 02:04:29 +0000639 """Return the filename that can be used to locate an object's source.
640 Return None if no way can be identified to get the source.
641 """
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000642 filename = getfile(object)
Brett Cannoncb66eb02012-05-11 12:58:42 -0400643 all_bytecode_suffixes = importlib.machinery.DEBUG_BYTECODE_SUFFIXES[:]
644 all_bytecode_suffixes += importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES[:]
645 if any(filename.endswith(s) for s in all_bytecode_suffixes):
646 filename = (os.path.splitext(filename)[0] +
647 importlib.machinery.SOURCE_SUFFIXES[0])
648 elif any(filename.endswith(s) for s in
649 importlib.machinery.EXTENSION_SUFFIXES):
650 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000651 if os.path.exists(filename):
652 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653 # only return a non-existent filename if the module has a PEP 302 loader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400654 if getattr(getmodule(object, filename), '__loader__', None) is not None:
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000655 return filename
R. David Murraya1b37402010-06-17 02:04:29 +0000656 # or it is in the linecache
657 if filename in linecache.cache:
658 return filename
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000659
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000661 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000662
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000663 The idea is for each object to have a unique origin, so this routine
664 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000665 if _filename is None:
666 _filename = getsourcefile(object) or getfile(object)
667 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000668
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000669modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000670_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000671
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000672def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000673 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000674 if ismodule(object):
675 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000676 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000677 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000678 # Try the filename to modulename cache
679 if _filename is not None and _filename in modulesbyfile:
680 return sys.modules.get(modulesbyfile[_filename])
681 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000682 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000684 except TypeError:
685 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000686 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000687 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000688 # Update the filename to module name cache and check yet again
689 # Copy sys.modules in order to cope with changes while iterating
Éric Araujoa74f8ef2011-11-29 16:58:53 +0100690 for modname, module in list(sys.modules.items()):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000691 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000692 f = module.__file__
693 if f == _filesbymodname.get(modname, None):
694 # Have already mapped this module, so skip it
695 continue
696 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000697 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000698 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000699 modulesbyfile[f] = modulesbyfile[
700 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000701 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000702 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000703 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000704 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000705 if not hasattr(object, '__name__'):
706 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000707 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000708 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000709 if mainobject is object:
710 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000711 # Check builtins
Georg Brandl1a3284e2007-12-02 09:40:06 +0000712 builtin = sys.modules['builtins']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000713 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000714 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000715 if builtinobject is object:
716 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000717
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000718def findsource(object):
719 """Return the entire source file and starting line number for an object.
720
721 The argument may be a module, class, method, function, traceback, frame,
722 or code object. The source code is returned as a list of all the lines
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200723 in the file and the line number indexes a line in that list. An OSError
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000724 is raised if the source code cannot be retrieved."""
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500725
Yury Selivanovef1e7502014-12-08 16:05:34 -0500726 file = getsourcefile(object)
727 if file:
728 # Invalidate cache if needed.
729 linecache.checkcache(file)
730 else:
731 file = getfile(object)
732 # Allow filenames in form of "<something>" to pass through.
733 # `doctest` monkeypatches `linecache` module to enable
734 # inspection, so let `linecache.getlines` to be called.
735 if not (file.startswith('<') and file.endswith('>')):
736 raise OSError('source code not available')
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500737
Thomas Wouters89f507f2006-12-13 04:49:30 +0000738 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000739 if module:
740 lines = linecache.getlines(file, module.__dict__)
741 else:
742 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000743 if not lines:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200744 raise OSError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000745
746 if ismodule(object):
747 return lines, 0
748
749 if isclass(object):
750 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000751 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
752 # make some effort to find the best matching class definition:
753 # use the one with the least indentation, which is the one
754 # that's most probably not inside a function definition.
755 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000756 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000757 match = pat.match(lines[i])
758 if match:
759 # if it's at toplevel, it's already the best one
760 if lines[i][0] == 'c':
761 return lines, i
762 # else add whitespace to candidate list
763 candidates.append((match.group(1), i))
764 if candidates:
765 # this will sort by whitespace, and by line number,
766 # less whitespace first
767 candidates.sort()
768 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000769 else:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200770 raise OSError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000771
772 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000773 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000774 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000775 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000776 if istraceback(object):
777 object = object.tb_frame
778 if isframe(object):
779 object = object.f_code
780 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000781 if not hasattr(object, 'co_firstlineno'):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200782 raise OSError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000783 lnum = object.co_firstlineno - 1
Yury Selivanove4e811d2015-07-21 19:01:52 +0300784 pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000785 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000786 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000787 lnum = lnum - 1
788 return lines, lnum
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200789 raise OSError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000790
791def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000792 """Get lines of comments immediately preceding an object's source code.
793
794 Returns None when source can't be found.
795 """
796 try:
797 lines, lnum = findsource(object)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200798 except (OSError, TypeError):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000799 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000800
801 if ismodule(object):
802 # Look for a comment block at the top of the file.
803 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000804 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000805 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000806 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000807 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000808 comments = []
809 end = start
810 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000811 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000812 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000813 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000814
815 # Look for a preceding block of comments at the same indentation.
816 elif lnum > 0:
817 indent = indentsize(lines[lnum])
818 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000819 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000820 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000821 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000822 if end > 0:
823 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000824 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000825 while comment[:1] == '#' and indentsize(lines[end]) == indent:
826 comments[:0] = [comment]
827 end = end - 1
828 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000829 comment = lines[end].expandtabs().lstrip()
830 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000831 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000832 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000833 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000834 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000835
Tim Peters4efb6e92001-06-29 23:51:08 +0000836class EndOfBlock(Exception): pass
837
838class BlockFinder:
839 """Provide a tokeneater() method to detect the end of a code block."""
840 def __init__(self):
841 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000842 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000843 self.started = False
844 self.passline = False
Meador Inge5b718d72015-07-23 22:49:37 -0500845 self.indecorator = False
846 self.decoratorhasargs = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000847 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000848
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000849 def tokeneater(self, type, token, srowcol, erowcol, line):
Meador Inge5b718d72015-07-23 22:49:37 -0500850 if not self.started and not self.indecorator:
851 # skip any decorators
852 if token == "@":
853 self.indecorator = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000854 # look for the first "def", "class" or "lambda"
Meador Inge5b718d72015-07-23 22:49:37 -0500855 elif token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000856 if token == "lambda":
857 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000858 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000859 self.passline = True # skip to the end of the line
Meador Inge5b718d72015-07-23 22:49:37 -0500860 elif token == "(":
861 if self.indecorator:
862 self.decoratorhasargs = True
863 elif token == ")":
864 if self.indecorator:
865 self.indecorator = False
866 self.decoratorhasargs = False
Tim Peters4efb6e92001-06-29 23:51:08 +0000867 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000868 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000869 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000870 if self.islambda: # lambdas always end at the first NEWLINE
871 raise EndOfBlock
Meador Inge5b718d72015-07-23 22:49:37 -0500872 # hitting a NEWLINE when in a decorator without args
873 # ends the decorator
874 if self.indecorator and not self.decoratorhasargs:
875 self.indecorator = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000876 elif self.passline:
877 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000878 elif type == tokenize.INDENT:
879 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000880 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000881 elif type == tokenize.DEDENT:
882 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000883 # the end of matching indent/dedent pairs end a block
884 # (note that this only works for "def"/"class" blocks,
885 # not e.g. for "if: else:" or "try: finally:" blocks)
886 if self.indent <= 0:
887 raise EndOfBlock
888 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
889 # any other token on the same indentation level end the previous
890 # block as well, except the pseudo-tokens COMMENT and NL.
891 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000892
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000893def getblock(lines):
894 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000895 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000896 try:
Trent Nelson428de652008-03-18 22:41:35 +0000897 tokens = tokenize.generate_tokens(iter(lines).__next__)
898 for _token in tokens:
899 blockfinder.tokeneater(*_token)
Armin Rigodd5c0232005-09-25 11:45:45 +0000900 except (EndOfBlock, IndentationError):
901 pass
902 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000903
904def getsourcelines(object):
905 """Return a list of source lines and starting line number for an object.
906
907 The argument may be a module, class, method, function, traceback, frame,
908 or code object. The source code is returned as a list of the lines
909 corresponding to the object and the line number indicates where in the
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200910 original source file the first line of code was found. An OSError is
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000911 raised if the source code cannot be retrieved."""
Yury Selivanov081bbf62014-09-26 17:34:54 -0400912 object = unwrap(object)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000913 lines, lnum = findsource(object)
914
Meador Inge5b718d72015-07-23 22:49:37 -0500915 if ismodule(object):
916 return lines, 0
917 else:
918 return getblock(lines[lnum:]), lnum + 1
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000919
920def getsource(object):
921 """Return the text of the source code for an object.
922
923 The argument may be a module, class, method, function, traceback, frame,
924 or code object. The source code is returned as a single string. An
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200925 OSError is raised if the source code cannot be retrieved."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000926 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000927 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000928
929# --------------------------------------------------- class tree extraction
930def walktree(classes, children, parent):
931 """Recursive helper function for getclasstree()."""
932 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000933 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000934 for c in classes:
935 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000936 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000937 results.append(walktree(children[c], children, c))
938 return results
939
Georg Brandl5ce83a02009-06-01 17:23:51 +0000940def getclasstree(classes, unique=False):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000941 """Arrange the given list of classes into a hierarchy of nested lists.
942
943 Where a nested list appears, it contains classes derived from the class
944 whose entry immediately precedes the list. Each entry is a 2-tuple
945 containing a class and a tuple of its base classes. If the 'unique'
946 argument is true, exactly one entry appears in the returned structure
947 for each class in the given list. Otherwise, classes using multiple
948 inheritance and their descendants will appear multiple times."""
949 children = {}
950 roots = []
951 for c in classes:
952 if c.__bases__:
953 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000954 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000955 children[parent] = []
Serhiy Storchaka362c1b52013-09-05 17:14:32 +0300956 if c not in children[parent]:
957 children[parent].append(c)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000958 if unique and parent in classes: break
959 elif c not in roots:
960 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000961 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000962 if parent not in classes:
963 roots.append(parent)
964 return walktree(roots, children, None)
965
966# ------------------------------------------------ argument list extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000967Arguments = namedtuple('Arguments', 'args, varargs, varkw')
968
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000969def getargs(co):
970 """Get information about the arguments accepted by a code object.
971
Guido van Rossum2e65f892007-02-28 22:03:49 +0000972 Three things are returned: (args, varargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000973 'args' is the list of argument names. Keyword-only arguments are
974 appended. 'varargs' and 'varkw' are the names of the * and **
975 arguments or None."""
Guido van Rossum2e65f892007-02-28 22:03:49 +0000976 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000977 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000978
979def _getfullargs(co):
980 """Get information about the arguments accepted by a code object.
981
982 Four things are returned: (args, varargs, kwonlyargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000983 'args' and 'kwonlyargs' are lists of argument names, and 'varargs'
984 and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000985
986 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000987 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000988
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000989 nargs = co.co_argcount
990 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000991 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000992 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000993 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000994 step = 0
995
Guido van Rossum2e65f892007-02-28 22:03:49 +0000996 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000997 varargs = None
998 if co.co_flags & CO_VARARGS:
999 varargs = co.co_varnames[nargs]
1000 nargs = nargs + 1
1001 varkw = None
1002 if co.co_flags & CO_VARKEYWORDS:
1003 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +00001004 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001005
Christian Heimes25bb7832008-01-11 16:17:00 +00001006FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +00001007 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +00001008
1009def getfullargspec(func):
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001010 """Get the names and default values of a callable object's arguments.
Guido van Rossum2e65f892007-02-28 22:03:49 +00001011
Brett Cannon504d8852007-09-07 02:12:14 +00001012 A tuple of seven things is returned:
1013 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001014 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +00001015 'varargs' and 'varkw' are the names of the * and ** arguments or None.
1016 'defaults' is an n-tuple of the default values of the last n arguments.
1017 'kwonlyargs' is a list of keyword-only argument names.
1018 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
1019 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001020
Guido van Rossum2e65f892007-02-28 22:03:49 +00001021 The first four items in the tuple correspond to getargspec().
Yury Selivanov3cfec2e2015-05-22 11:38:38 -04001022
1023 This function is deprecated, use inspect.signature() instead.
Jeremy Hylton64967882003-06-27 18:14:39 +00001024 """
1025
Yury Selivanov57d240e2014-02-19 16:27:23 -05001026 try:
1027 # Re: `skip_bound_arg=False`
1028 #
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001029 # There is a notable difference in behaviour between getfullargspec
1030 # and Signature: the former always returns 'self' parameter for bound
1031 # methods, whereas the Signature always shows the actual calling
1032 # signature of the passed object.
1033 #
1034 # To simulate this behaviour, we "unbind" bound methods, to trick
1035 # inspect.signature to always return their first parameter ("self",
1036 # usually)
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001037
Yury Selivanov57d240e2014-02-19 16:27:23 -05001038 # Re: `follow_wrapper_chains=False`
1039 #
1040 # getfullargspec() historically ignored __wrapped__ attributes,
1041 # so we ensure that remains the case in 3.3+
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001042
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001043 sig = _signature_from_callable(func,
1044 follow_wrapper_chains=False,
1045 skip_bound_arg=False,
1046 sigcls=Signature)
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001047 except Exception as ex:
1048 # Most of the times 'signature' will raise ValueError.
1049 # But, it can also raise AttributeError, and, maybe something
1050 # else. So to be fully backwards compatible, we catch all
1051 # possible exceptions here, and reraise a TypeError.
1052 raise TypeError('unsupported callable') from ex
1053
1054 args = []
1055 varargs = None
1056 varkw = None
1057 kwonlyargs = []
1058 defaults = ()
1059 annotations = {}
1060 defaults = ()
1061 kwdefaults = {}
1062
1063 if sig.return_annotation is not sig.empty:
1064 annotations['return'] = sig.return_annotation
1065
1066 for param in sig.parameters.values():
1067 kind = param.kind
1068 name = param.name
1069
1070 if kind is _POSITIONAL_ONLY:
1071 args.append(name)
1072 elif kind is _POSITIONAL_OR_KEYWORD:
1073 args.append(name)
1074 if param.default is not param.empty:
1075 defaults += (param.default,)
1076 elif kind is _VAR_POSITIONAL:
1077 varargs = name
1078 elif kind is _KEYWORD_ONLY:
1079 kwonlyargs.append(name)
1080 if param.default is not param.empty:
1081 kwdefaults[name] = param.default
1082 elif kind is _VAR_KEYWORD:
1083 varkw = name
1084
1085 if param.annotation is not param.empty:
1086 annotations[name] = param.annotation
1087
1088 if not kwdefaults:
1089 # compatibility with 'func.__kwdefaults__'
1090 kwdefaults = None
1091
1092 if not defaults:
1093 # compatibility with 'func.__defaults__'
1094 defaults = None
1095
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001096 return FullArgSpec(args, varargs, varkw, defaults,
1097 kwonlyargs, kwdefaults, annotations)
1098
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001099
Christian Heimes25bb7832008-01-11 16:17:00 +00001100ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
1101
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001102def getargvalues(frame):
1103 """Get information about arguments passed into a particular frame.
1104
1105 A tuple of four things is returned: (args, varargs, varkw, locals).
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001106 'args' is a list of the argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001107 'varargs' and 'varkw' are the names of the * and ** arguments or None.
1108 'locals' is the locals dictionary of the given frame."""
1109 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001110 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001111
Guido van Rossum2e65f892007-02-28 22:03:49 +00001112def formatannotation(annotation, base_module=None):
1113 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +00001114 if annotation.__module__ in ('builtins', base_module):
Serhiy Storchaka521e5862014-07-22 15:00:37 +03001115 return annotation.__qualname__
1116 return annotation.__module__+'.'+annotation.__qualname__
Guido van Rossum2e65f892007-02-28 22:03:49 +00001117 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001118
Guido van Rossum2e65f892007-02-28 22:03:49 +00001119def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001120 module = getattr(object, '__module__', None)
1121 def _formatannotation(annotation):
1122 return formatannotation(annotation, module)
1123 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +00001124
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001125def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +00001126 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001127 formatarg=str,
1128 formatvarargs=lambda name: '*' + name,
1129 formatvarkw=lambda name: '**' + name,
1130 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +00001131 formatreturns=lambda text: ' -> ' + text,
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001132 formatannotation=formatannotation):
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001133 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +00001134 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001135
Guido van Rossum2e65f892007-02-28 22:03:49 +00001136 The first seven arguments are (args, varargs, varkw, defaults,
1137 kwonlyargs, kwonlydefaults, annotations). The other five arguments
1138 are the corresponding optional formatting functions that are called to
1139 turn names and values into strings. The last argument is an optional
1140 function to format the sequence of arguments."""
1141 def formatargandannotation(arg):
1142 result = formatarg(arg)
1143 if arg in annotations:
1144 result += ': ' + formatannotation(annotations[arg])
1145 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001146 specs = []
1147 if defaults:
1148 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +00001149 for i, arg in enumerate(args):
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001150 spec = formatargandannotation(arg)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001151 if defaults and i >= firstdefault:
1152 spec = spec + formatvalue(defaults[i - firstdefault])
1153 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +00001154 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001155 specs.append(formatvarargs(formatargandannotation(varargs)))
1156 else:
1157 if kwonlyargs:
1158 specs.append('*')
1159 if kwonlyargs:
1160 for kwonlyarg in kwonlyargs:
1161 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +00001162 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001163 spec += formatvalue(kwonlydefaults[kwonlyarg])
1164 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +00001165 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001166 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001167 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +00001168 if 'return' in annotations:
1169 result += formatreturns(formatannotation(annotations['return']))
1170 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001171
1172def formatargvalues(args, varargs, varkw, locals,
1173 formatarg=str,
1174 formatvarargs=lambda name: '*' + name,
1175 formatvarkw=lambda name: '**' + name,
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001176 formatvalue=lambda value: '=' + repr(value)):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001177 """Format an argument spec from the 4 values returned by getargvalues.
1178
1179 The first four arguments are (args, varargs, varkw, locals). The
1180 next four arguments are the corresponding optional formatting functions
1181 that are called to turn names and values into strings. The ninth
1182 argument is an optional function to format the sequence of arguments."""
1183 def convert(name, locals=locals,
1184 formatarg=formatarg, formatvalue=formatvalue):
1185 return formatarg(name) + formatvalue(locals[name])
1186 specs = []
1187 for i in range(len(args)):
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001188 specs.append(convert(args[i]))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001189 if varargs:
1190 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
1191 if varkw:
1192 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001193 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001194
Benjamin Petersone109c702011-06-24 09:37:26 -05001195def _missing_arguments(f_name, argnames, pos, values):
1196 names = [repr(name) for name in argnames if name not in values]
1197 missing = len(names)
1198 if missing == 1:
1199 s = names[0]
1200 elif missing == 2:
1201 s = "{} and {}".format(*names)
1202 else:
Yury Selivanovdccfa132014-03-27 18:42:52 -04001203 tail = ", {} and {}".format(*names[-2:])
Benjamin Petersone109c702011-06-24 09:37:26 -05001204 del names[-2:]
1205 s = ", ".join(names) + tail
1206 raise TypeError("%s() missing %i required %s argument%s: %s" %
1207 (f_name, missing,
1208 "positional" if pos else "keyword-only",
1209 "" if missing == 1 else "s", s))
1210
1211def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
Benjamin Petersonb204a422011-06-05 22:04:07 -05001212 atleast = len(args) - defcount
Benjamin Petersonb204a422011-06-05 22:04:07 -05001213 kwonly_given = len([arg for arg in kwonly if arg in values])
1214 if varargs:
1215 plural = atleast != 1
1216 sig = "at least %d" % (atleast,)
1217 elif defcount:
1218 plural = True
1219 sig = "from %d to %d" % (atleast, len(args))
1220 else:
1221 plural = len(args) != 1
1222 sig = str(len(args))
1223 kwonly_sig = ""
1224 if kwonly_given:
1225 msg = " positional argument%s (and %d keyword-only argument%s)"
1226 kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
1227 "s" if kwonly_given != 1 else ""))
1228 raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
1229 (f_name, sig, "s" if plural else "", given, kwonly_sig,
1230 "was" if given == 1 and not kwonly_given else "were"))
1231
Benjamin Peterson3e6ab172014-01-02 12:24:08 -06001232def getcallargs(*func_and_positional, **named):
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001233 """Get the mapping of arguments to values.
1234
1235 A dict is returned, with keys the function argument names (including the
1236 names of the * and ** arguments, if any), and values the respective bound
1237 values from 'positional' and 'named'."""
Benjamin Peterson3e6ab172014-01-02 12:24:08 -06001238 func = func_and_positional[0]
1239 positional = func_and_positional[1:]
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001240 spec = getfullargspec(func)
1241 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
1242 f_name = func.__name__
1243 arg2value = {}
1244
Benjamin Petersonb204a422011-06-05 22:04:07 -05001245
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001246 if ismethod(func) and func.__self__ is not None:
1247 # implicit 'self' (or 'cls' for classmethods) argument
1248 positional = (func.__self__,) + positional
1249 num_pos = len(positional)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001250 num_args = len(args)
1251 num_defaults = len(defaults) if defaults else 0
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001252
Benjamin Petersonb204a422011-06-05 22:04:07 -05001253 n = min(num_pos, num_args)
1254 for i in range(n):
1255 arg2value[args[i]] = positional[i]
1256 if varargs:
1257 arg2value[varargs] = tuple(positional[n:])
1258 possible_kwargs = set(args + kwonlyargs)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001259 if varkw:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001260 arg2value[varkw] = {}
1261 for kw, value in named.items():
1262 if kw not in possible_kwargs:
1263 if not varkw:
1264 raise TypeError("%s() got an unexpected keyword argument %r" %
1265 (f_name, kw))
1266 arg2value[varkw][kw] = value
1267 continue
1268 if kw in arg2value:
1269 raise TypeError("%s() got multiple values for argument %r" %
1270 (f_name, kw))
1271 arg2value[kw] = value
1272 if num_pos > num_args and not varargs:
Benjamin Petersone109c702011-06-24 09:37:26 -05001273 _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
1274 num_pos, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001275 if num_pos < num_args:
Benjamin Petersone109c702011-06-24 09:37:26 -05001276 req = args[:num_args - num_defaults]
1277 for arg in req:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001278 if arg not in arg2value:
Benjamin Petersone109c702011-06-24 09:37:26 -05001279 _missing_arguments(f_name, req, True, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001280 for i, arg in enumerate(args[num_args - num_defaults:]):
1281 if arg not in arg2value:
1282 arg2value[arg] = defaults[i]
Benjamin Petersone109c702011-06-24 09:37:26 -05001283 missing = 0
Benjamin Petersonb204a422011-06-05 22:04:07 -05001284 for kwarg in kwonlyargs:
1285 if kwarg not in arg2value:
Yury Selivanov875df202014-03-27 18:23:03 -04001286 if kwonlydefaults and kwarg in kwonlydefaults:
Benjamin Petersone109c702011-06-24 09:37:26 -05001287 arg2value[kwarg] = kwonlydefaults[kwarg]
1288 else:
1289 missing += 1
1290 if missing:
1291 _missing_arguments(f_name, kwonlyargs, False, arg2value)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001292 return arg2value
1293
Nick Coghlan2f92e542012-06-23 19:39:55 +10001294ClosureVars = namedtuple('ClosureVars', 'nonlocals globals builtins unbound')
1295
1296def getclosurevars(func):
1297 """
1298 Get the mapping of free variables to their current values.
1299
Meador Inge8fda3592012-07-19 21:33:21 -05001300 Returns a named tuple of dicts mapping the current nonlocal, global
Nick Coghlan2f92e542012-06-23 19:39:55 +10001301 and builtin references as seen by the body of the function. A final
1302 set of unbound names that could not be resolved is also provided.
1303 """
1304
1305 if ismethod(func):
1306 func = func.__func__
1307
1308 if not isfunction(func):
1309 raise TypeError("'{!r}' is not a Python function".format(func))
1310
1311 code = func.__code__
1312 # Nonlocal references are named in co_freevars and resolved
1313 # by looking them up in __closure__ by positional index
1314 if func.__closure__ is None:
1315 nonlocal_vars = {}
1316 else:
1317 nonlocal_vars = {
1318 var : cell.cell_contents
1319 for var, cell in zip(code.co_freevars, func.__closure__)
1320 }
1321
1322 # Global and builtin references are named in co_names and resolved
1323 # by looking them up in __globals__ or __builtins__
1324 global_ns = func.__globals__
1325 builtin_ns = global_ns.get("__builtins__", builtins.__dict__)
1326 if ismodule(builtin_ns):
1327 builtin_ns = builtin_ns.__dict__
1328 global_vars = {}
1329 builtin_vars = {}
1330 unbound_names = set()
1331 for name in code.co_names:
1332 if name in ("None", "True", "False"):
1333 # Because these used to be builtins instead of keywords, they
1334 # may still show up as name references. We ignore them.
1335 continue
1336 try:
1337 global_vars[name] = global_ns[name]
1338 except KeyError:
1339 try:
1340 builtin_vars[name] = builtin_ns[name]
1341 except KeyError:
1342 unbound_names.add(name)
1343
1344 return ClosureVars(nonlocal_vars, global_vars,
1345 builtin_vars, unbound_names)
1346
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001347# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +00001348
1349Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
1350
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001351def getframeinfo(frame, context=1):
1352 """Get information about a frame or traceback object.
1353
1354 A tuple of five things is returned: the filename, the line number of
1355 the current line, the function name, a list of lines of context from
1356 the source code, and the index of the current line within that list.
1357 The optional second argument specifies the number of lines of context
1358 to return, which are centered around the current line."""
1359 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001360 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001361 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001362 else:
1363 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001364 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001365 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001366
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001367 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001368 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001369 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001370 try:
1371 lines, lnum = findsource(frame)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001372 except OSError:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001373 lines = index = None
1374 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001375 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001376 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001377 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001378 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001379 else:
1380 lines = index = None
1381
Christian Heimes25bb7832008-01-11 16:17:00 +00001382 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001383
1384def getlineno(frame):
1385 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001386 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1387 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001388
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001389FrameInfo = namedtuple('FrameInfo', ('frame',) + Traceback._fields)
1390
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001391def getouterframes(frame, context=1):
1392 """Get a list of records for a frame and all higher (calling) frames.
1393
1394 Each record contains a frame object, filename, line number, function
1395 name, a list of lines of context, and index within the context."""
1396 framelist = []
1397 while frame:
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001398 frameinfo = (frame,) + getframeinfo(frame, context)
1399 framelist.append(FrameInfo(*frameinfo))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001400 frame = frame.f_back
1401 return framelist
1402
1403def getinnerframes(tb, context=1):
1404 """Get a list of records for a traceback's frame and all lower frames.
1405
1406 Each record contains a frame object, filename, line number, function
1407 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001408 framelist = []
1409 while tb:
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001410 frameinfo = (tb.tb_frame,) + getframeinfo(tb, context)
1411 framelist.append(FrameInfo(*frameinfo))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001412 tb = tb.tb_next
1413 return framelist
1414
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001415def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001416 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001417 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001418
1419def stack(context=1):
1420 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001421 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001422
1423def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001424 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001425 return getinnerframes(sys.exc_info()[2], context)
Michael Foord95fc51d2010-11-20 15:07:30 +00001426
1427
1428# ------------------------------------------------ static version of getattr
1429
1430_sentinel = object()
1431
Michael Foorde5162652010-11-20 16:40:44 +00001432def _static_getmro(klass):
1433 return type.__dict__['__mro__'].__get__(klass)
1434
Michael Foord95fc51d2010-11-20 15:07:30 +00001435def _check_instance(obj, attr):
1436 instance_dict = {}
1437 try:
1438 instance_dict = object.__getattribute__(obj, "__dict__")
1439 except AttributeError:
1440 pass
Michael Foorddcebe0f2011-03-15 19:20:44 -04001441 return dict.get(instance_dict, attr, _sentinel)
Michael Foord95fc51d2010-11-20 15:07:30 +00001442
1443
1444def _check_class(klass, attr):
Michael Foorde5162652010-11-20 16:40:44 +00001445 for entry in _static_getmro(klass):
Michael Foorda51623b2011-12-18 22:01:40 +00001446 if _shadowed_dict(type(entry)) is _sentinel:
Michael Foorddcebe0f2011-03-15 19:20:44 -04001447 try:
1448 return entry.__dict__[attr]
1449 except KeyError:
1450 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001451 return _sentinel
1452
Michael Foord35184ed2010-11-20 16:58:30 +00001453def _is_type(obj):
1454 try:
1455 _static_getmro(obj)
1456 except TypeError:
1457 return False
1458 return True
1459
Michael Foorddcebe0f2011-03-15 19:20:44 -04001460def _shadowed_dict(klass):
1461 dict_attr = type.__dict__["__dict__"]
1462 for entry in _static_getmro(klass):
1463 try:
1464 class_dict = dict_attr.__get__(entry)["__dict__"]
1465 except KeyError:
1466 pass
1467 else:
1468 if not (type(class_dict) is types.GetSetDescriptorType and
1469 class_dict.__name__ == "__dict__" and
1470 class_dict.__objclass__ is entry):
Michael Foorda51623b2011-12-18 22:01:40 +00001471 return class_dict
1472 return _sentinel
Michael Foord95fc51d2010-11-20 15:07:30 +00001473
1474def getattr_static(obj, attr, default=_sentinel):
1475 """Retrieve attributes without triggering dynamic lookup via the
1476 descriptor protocol, __getattr__ or __getattribute__.
1477
1478 Note: this function may not be able to retrieve all attributes
1479 that getattr can fetch (like dynamically created attributes)
1480 and may find attributes that getattr can't (like descriptors
1481 that raise AttributeError). It can also return descriptor objects
1482 instead of instance members in some cases. See the
1483 documentation for details.
1484 """
1485 instance_result = _sentinel
Michael Foord35184ed2010-11-20 16:58:30 +00001486 if not _is_type(obj):
Michael Foordcc7ebb82010-11-20 16:20:16 +00001487 klass = type(obj)
Michael Foorda51623b2011-12-18 22:01:40 +00001488 dict_attr = _shadowed_dict(klass)
1489 if (dict_attr is _sentinel or
1490 type(dict_attr) is types.MemberDescriptorType):
Michael Foorddcebe0f2011-03-15 19:20:44 -04001491 instance_result = _check_instance(obj, attr)
Michael Foord95fc51d2010-11-20 15:07:30 +00001492 else:
1493 klass = obj
1494
1495 klass_result = _check_class(klass, attr)
1496
1497 if instance_result is not _sentinel and klass_result is not _sentinel:
1498 if (_check_class(type(klass_result), '__get__') is not _sentinel and
1499 _check_class(type(klass_result), '__set__') is not _sentinel):
1500 return klass_result
1501
1502 if instance_result is not _sentinel:
1503 return instance_result
1504 if klass_result is not _sentinel:
1505 return klass_result
1506
1507 if obj is klass:
1508 # for types we check the metaclass too
Michael Foorde5162652010-11-20 16:40:44 +00001509 for entry in _static_getmro(type(klass)):
Michael Foord3ba95f82011-12-22 01:13:37 +00001510 if _shadowed_dict(type(entry)) is _sentinel:
1511 try:
1512 return entry.__dict__[attr]
1513 except KeyError:
1514 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001515 if default is not _sentinel:
1516 return default
1517 raise AttributeError(attr)
Nick Coghlane0f04652010-11-21 03:44:04 +00001518
1519
Nick Coghlan04e2e3f2012-06-23 19:52:05 +10001520# ------------------------------------------------ generator introspection
1521
Nick Coghlan7921b9f2010-11-30 06:36:04 +00001522GEN_CREATED = 'GEN_CREATED'
1523GEN_RUNNING = 'GEN_RUNNING'
1524GEN_SUSPENDED = 'GEN_SUSPENDED'
1525GEN_CLOSED = 'GEN_CLOSED'
Nick Coghlane0f04652010-11-21 03:44:04 +00001526
1527def getgeneratorstate(generator):
1528 """Get current state of a generator-iterator.
1529
1530 Possible states are:
1531 GEN_CREATED: Waiting to start execution.
1532 GEN_RUNNING: Currently being executed by the interpreter.
1533 GEN_SUSPENDED: Currently suspended at a yield expression.
1534 GEN_CLOSED: Execution has completed.
1535 """
1536 if generator.gi_running:
1537 return GEN_RUNNING
1538 if generator.gi_frame is None:
1539 return GEN_CLOSED
1540 if generator.gi_frame.f_lasti == -1:
1541 return GEN_CREATED
1542 return GEN_SUSPENDED
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001543
1544
Nick Coghlan04e2e3f2012-06-23 19:52:05 +10001545def getgeneratorlocals(generator):
1546 """
1547 Get the mapping of generator local variables to their current values.
1548
1549 A dict is returned, with the keys the local variable names and values the
1550 bound values."""
1551
1552 if not isgenerator(generator):
1553 raise TypeError("'{!r}' is not a Python generator".format(generator))
1554
1555 frame = getattr(generator, "gi_frame", None)
1556 if frame is not None:
1557 return generator.gi_frame.f_locals
1558 else:
1559 return {}
1560
Yury Selivanov5376ba92015-06-22 12:19:30 -04001561
1562# ------------------------------------------------ coroutine introspection
1563
1564CORO_CREATED = 'CORO_CREATED'
1565CORO_RUNNING = 'CORO_RUNNING'
1566CORO_SUSPENDED = 'CORO_SUSPENDED'
1567CORO_CLOSED = 'CORO_CLOSED'
1568
1569def getcoroutinestate(coroutine):
1570 """Get current state of a coroutine object.
1571
1572 Possible states are:
1573 CORO_CREATED: Waiting to start execution.
1574 CORO_RUNNING: Currently being executed by the interpreter.
1575 CORO_SUSPENDED: Currently suspended at an await expression.
1576 CORO_CLOSED: Execution has completed.
1577 """
1578 if coroutine.cr_running:
1579 return CORO_RUNNING
1580 if coroutine.cr_frame is None:
1581 return CORO_CLOSED
1582 if coroutine.cr_frame.f_lasti == -1:
1583 return CORO_CREATED
1584 return CORO_SUSPENDED
1585
1586
1587def getcoroutinelocals(coroutine):
1588 """
1589 Get the mapping of coroutine local variables to their current values.
1590
1591 A dict is returned, with the keys the local variable names and values the
1592 bound values."""
1593 frame = getattr(coroutine, "cr_frame", None)
1594 if frame is not None:
1595 return frame.f_locals
1596 else:
1597 return {}
1598
1599
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001600###############################################################################
1601### Function Signature Object (PEP 362)
1602###############################################################################
1603
1604
1605_WrapperDescriptor = type(type.__call__)
1606_MethodWrapper = type(all.__call__)
Larry Hastings5c661892014-01-24 06:17:25 -08001607_ClassMethodWrapper = type(int.__dict__['from_bytes'])
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001608
1609_NonUserDefinedCallables = (_WrapperDescriptor,
1610 _MethodWrapper,
Larry Hastings5c661892014-01-24 06:17:25 -08001611 _ClassMethodWrapper,
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001612 types.BuiltinFunctionType)
1613
1614
Yury Selivanov421f0c72014-01-29 12:05:40 -05001615def _signature_get_user_defined_method(cls, method_name):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001616 """Private helper. Checks if ``cls`` has an attribute
1617 named ``method_name`` and returns it only if it is a
1618 pure python function.
1619 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001620 try:
1621 meth = getattr(cls, method_name)
1622 except AttributeError:
1623 return
1624 else:
1625 if not isinstance(meth, _NonUserDefinedCallables):
1626 # Once '__signature__' will be added to 'C'-level
1627 # callables, this check won't be necessary
1628 return meth
1629
1630
Yury Selivanov62560fb2014-01-28 12:26:24 -05001631def _signature_get_partial(wrapped_sig, partial, extra_args=()):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001632 """Private helper to calculate how 'wrapped_sig' signature will
1633 look like after applying a 'functools.partial' object (or alike)
1634 on it.
1635 """
Yury Selivanov62560fb2014-01-28 12:26:24 -05001636
Yury Selivanov3f73ca22014-04-08 11:30:45 -04001637 old_params = wrapped_sig.parameters
1638 new_params = OrderedDict(old_params.items())
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001639
1640 partial_args = partial.args or ()
1641 partial_keywords = partial.keywords or {}
1642
1643 if extra_args:
1644 partial_args = extra_args + partial_args
1645
1646 try:
1647 ba = wrapped_sig.bind_partial(*partial_args, **partial_keywords)
1648 except TypeError as ex:
1649 msg = 'partial object {!r} has incorrect arguments'.format(partial)
1650 raise ValueError(msg) from ex
1651
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001652
Yury Selivanov3f73ca22014-04-08 11:30:45 -04001653 transform_to_kwonly = False
1654 for param_name, param in old_params.items():
1655 try:
1656 arg_value = ba.arguments[param_name]
1657 except KeyError:
1658 pass
1659 else:
1660 if param.kind is _POSITIONAL_ONLY:
1661 # If positional-only parameter is bound by partial,
1662 # it effectively disappears from the signature
1663 new_params.pop(param_name)
1664 continue
1665
1666 if param.kind is _POSITIONAL_OR_KEYWORD:
1667 if param_name in partial_keywords:
1668 # This means that this parameter, and all parameters
1669 # after it should be keyword-only (and var-positional
1670 # should be removed). Here's why. Consider the following
1671 # function:
1672 # foo(a, b, *args, c):
1673 # pass
1674 #
1675 # "partial(foo, a='spam')" will have the following
1676 # signature: "(*, a='spam', b, c)". Because attempting
1677 # to call that partial with "(10, 20)" arguments will
1678 # raise a TypeError, saying that "a" argument received
1679 # multiple values.
1680 transform_to_kwonly = True
1681 # Set the new default value
1682 new_params[param_name] = param.replace(default=arg_value)
1683 else:
1684 # was passed as a positional argument
1685 new_params.pop(param.name)
1686 continue
1687
1688 if param.kind is _KEYWORD_ONLY:
1689 # Set the new default value
1690 new_params[param_name] = param.replace(default=arg_value)
1691
1692 if transform_to_kwonly:
1693 assert param.kind is not _POSITIONAL_ONLY
1694
1695 if param.kind is _POSITIONAL_OR_KEYWORD:
1696 new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY)
1697 new_params[param_name] = new_param
1698 new_params.move_to_end(param_name)
1699 elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD):
1700 new_params.move_to_end(param_name)
1701 elif param.kind is _VAR_POSITIONAL:
1702 new_params.pop(param.name)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001703
1704 return wrapped_sig.replace(parameters=new_params.values())
1705
1706
Yury Selivanov62560fb2014-01-28 12:26:24 -05001707def _signature_bound_method(sig):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001708 """Private helper to transform signatures for unbound
1709 functions to bound methods.
1710 """
Yury Selivanov62560fb2014-01-28 12:26:24 -05001711
1712 params = tuple(sig.parameters.values())
1713
1714 if not params or params[0].kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
1715 raise ValueError('invalid method signature')
1716
1717 kind = params[0].kind
1718 if kind in (_POSITIONAL_OR_KEYWORD, _POSITIONAL_ONLY):
1719 # Drop first parameter:
1720 # '(p1, p2[, ...])' -> '(p2[, ...])'
1721 params = params[1:]
1722 else:
1723 if kind is not _VAR_POSITIONAL:
1724 # Unless we add a new parameter type we never
1725 # get here
1726 raise ValueError('invalid argument type')
1727 # It's a var-positional parameter.
1728 # Do nothing. '(*args[, ...])' -> '(*args[, ...])'
1729
1730 return sig.replace(parameters=params)
1731
1732
Yury Selivanovb77511d2014-01-29 10:46:14 -05001733def _signature_is_builtin(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001734 """Private helper to test if `obj` is a callable that might
1735 support Argument Clinic's __text_signature__ protocol.
1736 """
Yury Selivanov1d241832014-02-02 12:51:20 -05001737 return (isbuiltin(obj) or
Yury Selivanovb77511d2014-01-29 10:46:14 -05001738 ismethoddescriptor(obj) or
Yury Selivanov1d241832014-02-02 12:51:20 -05001739 isinstance(obj, _NonUserDefinedCallables) or
Yury Selivanovb77511d2014-01-29 10:46:14 -05001740 # Can't test 'isinstance(type)' here, as it would
1741 # also be True for regular python classes
1742 obj in (type, object))
1743
1744
Yury Selivanov63da7c72014-01-31 14:48:37 -05001745def _signature_is_functionlike(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001746 """Private helper to test if `obj` is a duck type of FunctionType.
1747 A good example of such objects are functions compiled with
1748 Cython, which have all attributes that a pure Python function
1749 would have, but have their code statically compiled.
1750 """
Yury Selivanov63da7c72014-01-31 14:48:37 -05001751
1752 if not callable(obj) or isclass(obj):
1753 # All function-like objects are obviously callables,
1754 # and not classes.
1755 return False
1756
1757 name = getattr(obj, '__name__', None)
1758 code = getattr(obj, '__code__', None)
1759 defaults = getattr(obj, '__defaults__', _void) # Important to use _void ...
1760 kwdefaults = getattr(obj, '__kwdefaults__', _void) # ... and not None here
1761 annotations = getattr(obj, '__annotations__', None)
1762
1763 return (isinstance(code, types.CodeType) and
1764 isinstance(name, str) and
1765 (defaults is None or isinstance(defaults, tuple)) and
1766 (kwdefaults is None or isinstance(kwdefaults, dict)) and
1767 isinstance(annotations, dict))
1768
1769
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001770def _signature_get_bound_param(spec):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001771 """ Private helper to get first parameter name from a
1772 __text_signature__ of a builtin method, which should
1773 be in the following format: '($param1, ...)'.
1774 Assumptions are that the first argument won't have
1775 a default value or an annotation.
1776 """
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001777
1778 assert spec.startswith('($')
1779
1780 pos = spec.find(',')
1781 if pos == -1:
1782 pos = spec.find(')')
1783
1784 cpos = spec.find(':')
1785 assert cpos == -1 or cpos > pos
1786
1787 cpos = spec.find('=')
1788 assert cpos == -1 or cpos > pos
1789
1790 return spec[2:pos]
1791
1792
Larry Hastings2623c8c2014-02-08 22:15:29 -08001793def _signature_strip_non_python_syntax(signature):
1794 """
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001795 Private helper function. Takes a signature in Argument Clinic's
1796 extended signature format.
1797
Larry Hastings2623c8c2014-02-08 22:15:29 -08001798 Returns a tuple of three things:
1799 * that signature re-rendered in standard Python syntax,
1800 * the index of the "self" parameter (generally 0), or None if
1801 the function does not have a "self" parameter, and
1802 * the index of the last "positional only" parameter,
1803 or None if the signature has no positional-only parameters.
1804 """
1805
1806 if not signature:
1807 return signature, None, None
1808
1809 self_parameter = None
1810 last_positional_only = None
1811
1812 lines = [l.encode('ascii') for l in signature.split('\n')]
1813 generator = iter(lines).__next__
1814 token_stream = tokenize.tokenize(generator)
1815
1816 delayed_comma = False
1817 skip_next_comma = False
1818 text = []
1819 add = text.append
1820
1821 current_parameter = 0
1822 OP = token.OP
1823 ERRORTOKEN = token.ERRORTOKEN
1824
1825 # token stream always starts with ENCODING token, skip it
1826 t = next(token_stream)
1827 assert t.type == tokenize.ENCODING
1828
1829 for t in token_stream:
1830 type, string = t.type, t.string
1831
1832 if type == OP:
1833 if string == ',':
1834 if skip_next_comma:
1835 skip_next_comma = False
1836 else:
1837 assert not delayed_comma
1838 delayed_comma = True
1839 current_parameter += 1
1840 continue
1841
1842 if string == '/':
1843 assert not skip_next_comma
1844 assert last_positional_only is None
1845 skip_next_comma = True
1846 last_positional_only = current_parameter - 1
1847 continue
1848
1849 if (type == ERRORTOKEN) and (string == '$'):
1850 assert self_parameter is None
1851 self_parameter = current_parameter
1852 continue
1853
1854 if delayed_comma:
1855 delayed_comma = False
1856 if not ((type == OP) and (string == ')')):
1857 add(', ')
1858 add(string)
1859 if (string == ','):
1860 add(' ')
1861 clean_signature = ''.join(text)
1862 return clean_signature, self_parameter, last_positional_only
1863
1864
Yury Selivanov57d240e2014-02-19 16:27:23 -05001865def _signature_fromstr(cls, obj, s, skip_bound_arg=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001866 """Private helper to parse content of '__text_signature__'
1867 and return a Signature based on it.
1868 """
1869
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001870 Parameter = cls._parameter_cls
1871
Larry Hastings2623c8c2014-02-08 22:15:29 -08001872 clean_signature, self_parameter, last_positional_only = \
1873 _signature_strip_non_python_syntax(s)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001874
Larry Hastings2623c8c2014-02-08 22:15:29 -08001875 program = "def foo" + clean_signature + ": pass"
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001876
1877 try:
Larry Hastings2623c8c2014-02-08 22:15:29 -08001878 module = ast.parse(program)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001879 except SyntaxError:
1880 module = None
1881
1882 if not isinstance(module, ast.Module):
1883 raise ValueError("{!r} builtin has invalid signature".format(obj))
1884
1885 f = module.body[0]
1886
1887 parameters = []
1888 empty = Parameter.empty
1889 invalid = object()
1890
1891 module = None
1892 module_dict = {}
1893 module_name = getattr(obj, '__module__', None)
1894 if module_name:
1895 module = sys.modules.get(module_name, None)
1896 if module:
1897 module_dict = module.__dict__
1898 sys_module_dict = sys.modules
1899
1900 def parse_name(node):
1901 assert isinstance(node, ast.arg)
1902 if node.annotation != None:
1903 raise ValueError("Annotations are not currently supported")
1904 return node.arg
1905
1906 def wrap_value(s):
1907 try:
1908 value = eval(s, module_dict)
1909 except NameError:
1910 try:
1911 value = eval(s, sys_module_dict)
1912 except NameError:
1913 raise RuntimeError()
1914
1915 if isinstance(value, str):
1916 return ast.Str(value)
1917 if isinstance(value, (int, float)):
1918 return ast.Num(value)
1919 if isinstance(value, bytes):
1920 return ast.Bytes(value)
1921 if value in (True, False, None):
1922 return ast.NameConstant(value)
1923 raise RuntimeError()
1924
1925 class RewriteSymbolics(ast.NodeTransformer):
1926 def visit_Attribute(self, node):
1927 a = []
1928 n = node
1929 while isinstance(n, ast.Attribute):
1930 a.append(n.attr)
1931 n = n.value
1932 if not isinstance(n, ast.Name):
1933 raise RuntimeError()
1934 a.append(n.id)
1935 value = ".".join(reversed(a))
1936 return wrap_value(value)
1937
1938 def visit_Name(self, node):
1939 if not isinstance(node.ctx, ast.Load):
1940 raise ValueError()
1941 return wrap_value(node.id)
1942
1943 def p(name_node, default_node, default=empty):
1944 name = parse_name(name_node)
1945 if name is invalid:
1946 return None
1947 if default_node and default_node is not _empty:
1948 try:
1949 default_node = RewriteSymbolics().visit(default_node)
1950 o = ast.literal_eval(default_node)
1951 except ValueError:
1952 o = invalid
1953 if o is invalid:
1954 return None
1955 default = o if o is not invalid else default
1956 parameters.append(Parameter(name, kind, default=default, annotation=empty))
1957
1958 # non-keyword-only parameters
1959 args = reversed(f.args.args)
1960 defaults = reversed(f.args.defaults)
1961 iter = itertools.zip_longest(args, defaults, fillvalue=None)
Larry Hastings2623c8c2014-02-08 22:15:29 -08001962 if last_positional_only is not None:
1963 kind = Parameter.POSITIONAL_ONLY
1964 else:
1965 kind = Parameter.POSITIONAL_OR_KEYWORD
1966 for i, (name, default) in enumerate(reversed(list(iter))):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001967 p(name, default)
Larry Hastings2623c8c2014-02-08 22:15:29 -08001968 if i == last_positional_only:
1969 kind = Parameter.POSITIONAL_OR_KEYWORD
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001970
1971 # *args
1972 if f.args.vararg:
1973 kind = Parameter.VAR_POSITIONAL
1974 p(f.args.vararg, empty)
1975
1976 # keyword-only arguments
1977 kind = Parameter.KEYWORD_ONLY
1978 for name, default in zip(f.args.kwonlyargs, f.args.kw_defaults):
1979 p(name, default)
1980
1981 # **kwargs
1982 if f.args.kwarg:
1983 kind = Parameter.VAR_KEYWORD
1984 p(f.args.kwarg, empty)
1985
Larry Hastings2623c8c2014-02-08 22:15:29 -08001986 if self_parameter is not None:
Yury Selivanov8c185ee2014-02-21 01:32:42 -05001987 # Possibly strip the bound argument:
1988 # - We *always* strip first bound argument if
1989 # it is a module.
1990 # - We don't strip first bound argument if
1991 # skip_bound_arg is False.
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001992 assert parameters
Yury Selivanov8c185ee2014-02-21 01:32:42 -05001993 _self = getattr(obj, '__self__', None)
1994 self_isbound = _self is not None
1995 self_ismodule = ismodule(_self)
1996 if self_isbound and (self_ismodule or skip_bound_arg):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001997 parameters.pop(0)
1998 else:
1999 # for builtins, self parameter is always positional-only!
2000 p = parameters[0].replace(kind=Parameter.POSITIONAL_ONLY)
2001 parameters[0] = p
2002
2003 return cls(parameters, return_annotation=cls.empty)
2004
2005
Yury Selivanov57d240e2014-02-19 16:27:23 -05002006def _signature_from_builtin(cls, func, skip_bound_arg=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002007 """Private helper function to get signature for
2008 builtin callables.
2009 """
2010
Yury Selivanov57d240e2014-02-19 16:27:23 -05002011 if not _signature_is_builtin(func):
2012 raise TypeError("{!r} is not a Python builtin "
2013 "function".format(func))
2014
2015 s = getattr(func, "__text_signature__", None)
2016 if not s:
2017 raise ValueError("no signature found for builtin {!r}".format(func))
2018
2019 return _signature_fromstr(cls, func, s, skip_bound_arg)
2020
2021
Yury Selivanovcf45f022015-05-20 14:38:50 -04002022def _signature_from_function(cls, func):
2023 """Private helper: constructs Signature for the given python function."""
2024
2025 is_duck_function = False
2026 if not isfunction(func):
2027 if _signature_is_functionlike(func):
2028 is_duck_function = True
2029 else:
2030 # If it's not a pure Python function, and not a duck type
2031 # of pure function:
2032 raise TypeError('{!r} is not a Python function'.format(func))
2033
2034 Parameter = cls._parameter_cls
2035
2036 # Parameter information.
2037 func_code = func.__code__
2038 pos_count = func_code.co_argcount
2039 arg_names = func_code.co_varnames
2040 positional = tuple(arg_names[:pos_count])
2041 keyword_only_count = func_code.co_kwonlyargcount
2042 keyword_only = arg_names[pos_count:(pos_count + keyword_only_count)]
2043 annotations = func.__annotations__
2044 defaults = func.__defaults__
2045 kwdefaults = func.__kwdefaults__
2046
2047 if defaults:
2048 pos_default_count = len(defaults)
2049 else:
2050 pos_default_count = 0
2051
2052 parameters = []
2053
2054 # Non-keyword-only parameters w/o defaults.
2055 non_default_count = pos_count - pos_default_count
2056 for name in positional[:non_default_count]:
2057 annotation = annotations.get(name, _empty)
2058 parameters.append(Parameter(name, annotation=annotation,
2059 kind=_POSITIONAL_OR_KEYWORD))
2060
2061 # ... w/ defaults.
2062 for offset, name in enumerate(positional[non_default_count:]):
2063 annotation = annotations.get(name, _empty)
2064 parameters.append(Parameter(name, annotation=annotation,
2065 kind=_POSITIONAL_OR_KEYWORD,
2066 default=defaults[offset]))
2067
2068 # *args
2069 if func_code.co_flags & CO_VARARGS:
2070 name = arg_names[pos_count + keyword_only_count]
2071 annotation = annotations.get(name, _empty)
2072 parameters.append(Parameter(name, annotation=annotation,
2073 kind=_VAR_POSITIONAL))
2074
2075 # Keyword-only parameters.
2076 for name in keyword_only:
2077 default = _empty
2078 if kwdefaults is not None:
2079 default = kwdefaults.get(name, _empty)
2080
2081 annotation = annotations.get(name, _empty)
2082 parameters.append(Parameter(name, annotation=annotation,
2083 kind=_KEYWORD_ONLY,
2084 default=default))
2085 # **kwargs
2086 if func_code.co_flags & CO_VARKEYWORDS:
2087 index = pos_count + keyword_only_count
2088 if func_code.co_flags & CO_VARARGS:
2089 index += 1
2090
2091 name = arg_names[index]
2092 annotation = annotations.get(name, _empty)
2093 parameters.append(Parameter(name, annotation=annotation,
2094 kind=_VAR_KEYWORD))
2095
2096 # Is 'func' is a pure Python function - don't validate the
2097 # parameters list (for correct order and defaults), it should be OK.
2098 return cls(parameters,
2099 return_annotation=annotations.get('return', _empty),
2100 __validate_parameters__=is_duck_function)
2101
2102
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002103def _signature_from_callable(obj, *,
2104 follow_wrapper_chains=True,
2105 skip_bound_arg=True,
2106 sigcls):
2107
2108 """Private helper function to get signature for arbitrary
2109 callable objects.
2110 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002111
2112 if not callable(obj):
2113 raise TypeError('{!r} is not a callable object'.format(obj))
2114
2115 if isinstance(obj, types.MethodType):
2116 # In this case we skip the first parameter of the underlying
2117 # function (usually `self` or `cls`).
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002118 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002119 obj.__func__,
2120 follow_wrapper_chains=follow_wrapper_chains,
2121 skip_bound_arg=skip_bound_arg,
2122 sigcls=sigcls)
2123
Yury Selivanov57d240e2014-02-19 16:27:23 -05002124 if skip_bound_arg:
2125 return _signature_bound_method(sig)
2126 else:
2127 return sig
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002128
Nick Coghlane8c45d62013-07-28 20:00:01 +10002129 # Was this function wrapped by a decorator?
Yury Selivanov57d240e2014-02-19 16:27:23 -05002130 if follow_wrapper_chains:
2131 obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")))
Yury Selivanov46c759d2015-05-27 21:56:53 -04002132 if isinstance(obj, types.MethodType):
2133 # If the unwrapped object is a *method*, we might want to
2134 # skip its first parameter (self).
2135 # See test_signature_wrapped_bound_method for details.
Yury Selivanov507cd3c2015-05-27 21:59:03 -04002136 return _signature_from_callable(
Yury Selivanov46c759d2015-05-27 21:56:53 -04002137 obj,
2138 follow_wrapper_chains=follow_wrapper_chains,
Yury Selivanov507cd3c2015-05-27 21:59:03 -04002139 skip_bound_arg=skip_bound_arg,
2140 sigcls=sigcls)
Nick Coghlane8c45d62013-07-28 20:00:01 +10002141
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002142 try:
2143 sig = obj.__signature__
2144 except AttributeError:
2145 pass
2146 else:
2147 if sig is not None:
Yury Selivanov42407ab2014-06-23 10:23:50 -07002148 if not isinstance(sig, Signature):
2149 raise TypeError(
2150 'unexpected object {!r} in __signature__ '
2151 'attribute'.format(sig))
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002152 return sig
2153
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002154 try:
2155 partialmethod = obj._partialmethod
2156 except AttributeError:
2157 pass
2158 else:
Yury Selivanov0486f812014-01-29 12:18:59 -05002159 if isinstance(partialmethod, functools.partialmethod):
2160 # Unbound partialmethod (see functools.partialmethod)
2161 # This means, that we need to calculate the signature
2162 # as if it's a regular partial object, but taking into
2163 # account that the first positional argument
2164 # (usually `self`, or `cls`) will not be passed
2165 # automatically (as for boundmethods)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002166
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002167 wrapped_sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002168 partialmethod.func,
2169 follow_wrapper_chains=follow_wrapper_chains,
2170 skip_bound_arg=skip_bound_arg,
2171 sigcls=sigcls)
2172
Yury Selivanov0486f812014-01-29 12:18:59 -05002173 sig = _signature_get_partial(wrapped_sig, partialmethod, (None,))
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002174
Yury Selivanov0486f812014-01-29 12:18:59 -05002175 first_wrapped_param = tuple(wrapped_sig.parameters.values())[0]
2176 new_params = (first_wrapped_param,) + tuple(sig.parameters.values())
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002177
Yury Selivanov0486f812014-01-29 12:18:59 -05002178 return sig.replace(parameters=new_params)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002179
Yury Selivanov63da7c72014-01-31 14:48:37 -05002180 if isfunction(obj) or _signature_is_functionlike(obj):
2181 # If it's a pure Python function, or an object that is duck type
2182 # of a Python function (Cython functions, for instance), then:
Yury Selivanovcf45f022015-05-20 14:38:50 -04002183 return _signature_from_function(sigcls, obj)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002184
Yury Selivanova773de02014-02-21 18:30:53 -05002185 if _signature_is_builtin(obj):
Yury Selivanovda396452014-03-27 12:09:24 -04002186 return _signature_from_builtin(sigcls, obj,
Yury Selivanova773de02014-02-21 18:30:53 -05002187 skip_bound_arg=skip_bound_arg)
2188
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002189 if isinstance(obj, functools.partial):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002190 wrapped_sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002191 obj.func,
2192 follow_wrapper_chains=follow_wrapper_chains,
2193 skip_bound_arg=skip_bound_arg,
2194 sigcls=sigcls)
Yury Selivanov62560fb2014-01-28 12:26:24 -05002195 return _signature_get_partial(wrapped_sig, obj)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002196
2197 sig = None
2198 if isinstance(obj, type):
2199 # obj is a class or a metaclass
2200
2201 # First, let's see if it has an overloaded __call__ defined
2202 # in its metaclass
Yury Selivanov421f0c72014-01-29 12:05:40 -05002203 call = _signature_get_user_defined_method(type(obj), '__call__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002204 if call is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002205 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002206 call,
2207 follow_wrapper_chains=follow_wrapper_chains,
2208 skip_bound_arg=skip_bound_arg,
2209 sigcls=sigcls)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002210 else:
2211 # Now we check if the 'obj' class has a '__new__' method
Yury Selivanov421f0c72014-01-29 12:05:40 -05002212 new = _signature_get_user_defined_method(obj, '__new__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002213 if new is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002214 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002215 new,
2216 follow_wrapper_chains=follow_wrapper_chains,
2217 skip_bound_arg=skip_bound_arg,
2218 sigcls=sigcls)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002219 else:
2220 # Finally, we should have at least __init__ implemented
Yury Selivanov421f0c72014-01-29 12:05:40 -05002221 init = _signature_get_user_defined_method(obj, '__init__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002222 if init is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002223 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002224 init,
2225 follow_wrapper_chains=follow_wrapper_chains,
2226 skip_bound_arg=skip_bound_arg,
2227 sigcls=sigcls)
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002228
2229 if sig is None:
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002230 # At this point we know, that `obj` is a class, with no user-
2231 # defined '__init__', '__new__', or class-level '__call__'
2232
Larry Hastings2623c8c2014-02-08 22:15:29 -08002233 for base in obj.__mro__[:-1]:
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002234 # Since '__text_signature__' is implemented as a
2235 # descriptor that extracts text signature from the
2236 # class docstring, if 'obj' is derived from a builtin
2237 # class, its own '__text_signature__' may be 'None'.
Larry Hastings2623c8c2014-02-08 22:15:29 -08002238 # Therefore, we go through the MRO (except the last
2239 # class in there, which is 'object') to find the first
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002240 # class with non-empty text signature.
2241 try:
2242 text_sig = base.__text_signature__
2243 except AttributeError:
2244 pass
2245 else:
2246 if text_sig:
2247 # If 'obj' class has a __text_signature__ attribute:
2248 # return a signature based on it
Yury Selivanovda396452014-03-27 12:09:24 -04002249 return _signature_fromstr(sigcls, obj, text_sig)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002250
2251 # No '__text_signature__' was found for the 'obj' class.
2252 # Last option is to check if its '__init__' is
2253 # object.__init__ or type.__init__.
Larry Hastings2623c8c2014-02-08 22:15:29 -08002254 if type not in obj.__mro__:
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002255 # We have a class (not metaclass), but no user-defined
2256 # __init__ or __new__ for it
Yury Selivanovbf304fc2015-05-30 17:08:36 -04002257 if (obj.__init__ is object.__init__ and
2258 obj.__new__ is object.__new__):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002259 # Return a signature of 'object' builtin.
2260 return signature(object)
Yury Selivanovbf304fc2015-05-30 17:08:36 -04002261 else:
2262 raise ValueError(
2263 'no signature found for builtin type {!r}'.format(obj))
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002264
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002265 elif not isinstance(obj, _NonUserDefinedCallables):
2266 # An object with __call__
2267 # We also check that the 'obj' is not an instance of
2268 # _WrapperDescriptor or _MethodWrapper to avoid
2269 # infinite recursion (and even potential segfault)
Yury Selivanov421f0c72014-01-29 12:05:40 -05002270 call = _signature_get_user_defined_method(type(obj), '__call__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002271 if call is not None:
Larry Hastings2623c8c2014-02-08 22:15:29 -08002272 try:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002273 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002274 call,
2275 follow_wrapper_chains=follow_wrapper_chains,
2276 skip_bound_arg=skip_bound_arg,
2277 sigcls=sigcls)
Larry Hastings2623c8c2014-02-08 22:15:29 -08002278 except ValueError as ex:
2279 msg = 'no signature found for {!r}'.format(obj)
2280 raise ValueError(msg) from ex
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002281
2282 if sig is not None:
2283 # For classes and objects we skip the first parameter of their
2284 # __call__, __new__, or __init__ methods
Yury Selivanov57d240e2014-02-19 16:27:23 -05002285 if skip_bound_arg:
2286 return _signature_bound_method(sig)
2287 else:
2288 return sig
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002289
2290 if isinstance(obj, types.BuiltinFunctionType):
2291 # Raise a nicer error message for builtins
2292 msg = 'no signature found for builtin function {!r}'.format(obj)
2293 raise ValueError(msg)
2294
2295 raise ValueError('callable {!r} is not supported by signature'.format(obj))
2296
2297
2298class _void:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002299 """A private marker - used in Parameter & Signature."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002300
2301
2302class _empty:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002303 """Marker object for Signature.empty and Parameter.empty."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002304
2305
Yury Selivanov21e83a52014-03-27 11:23:13 -04002306class _ParameterKind(enum.IntEnum):
2307 POSITIONAL_ONLY = 0
2308 POSITIONAL_OR_KEYWORD = 1
2309 VAR_POSITIONAL = 2
2310 KEYWORD_ONLY = 3
2311 VAR_KEYWORD = 4
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002312
2313 def __str__(self):
Yury Selivanov21e83a52014-03-27 11:23:13 -04002314 return self._name_
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002315
2316
Yury Selivanov21e83a52014-03-27 11:23:13 -04002317_POSITIONAL_ONLY = _ParameterKind.POSITIONAL_ONLY
2318_POSITIONAL_OR_KEYWORD = _ParameterKind.POSITIONAL_OR_KEYWORD
2319_VAR_POSITIONAL = _ParameterKind.VAR_POSITIONAL
2320_KEYWORD_ONLY = _ParameterKind.KEYWORD_ONLY
2321_VAR_KEYWORD = _ParameterKind.VAR_KEYWORD
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002322
2323
2324class Parameter:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002325 """Represents a parameter in a function signature.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002326
2327 Has the following public attributes:
2328
2329 * name : str
2330 The name of the parameter as a string.
2331 * default : object
2332 The default value for the parameter if specified. If the
Yury Selivanov8757ead2014-01-28 16:39:25 -05002333 parameter has no default value, this attribute is set to
2334 `Parameter.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002335 * annotation
2336 The annotation for the parameter if specified. If the
Yury Selivanov8757ead2014-01-28 16:39:25 -05002337 parameter has no annotation, this attribute is set to
2338 `Parameter.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002339 * kind : str
2340 Describes how argument values are bound to the parameter.
2341 Possible values: `Parameter.POSITIONAL_ONLY`,
2342 `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`,
2343 `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002344 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002345
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002346 __slots__ = ('_name', '_kind', '_default', '_annotation')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002347
2348 POSITIONAL_ONLY = _POSITIONAL_ONLY
2349 POSITIONAL_OR_KEYWORD = _POSITIONAL_OR_KEYWORD
2350 VAR_POSITIONAL = _VAR_POSITIONAL
2351 KEYWORD_ONLY = _KEYWORD_ONLY
2352 VAR_KEYWORD = _VAR_KEYWORD
2353
2354 empty = _empty
2355
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002356 def __init__(self, name, kind, *, default=_empty, annotation=_empty):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002357
2358 if kind not in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD,
2359 _VAR_POSITIONAL, _KEYWORD_ONLY, _VAR_KEYWORD):
2360 raise ValueError("invalid value for 'Parameter.kind' attribute")
2361 self._kind = kind
2362
2363 if default is not _empty:
2364 if kind in (_VAR_POSITIONAL, _VAR_KEYWORD):
2365 msg = '{} parameters cannot have default values'.format(kind)
2366 raise ValueError(msg)
2367 self._default = default
2368 self._annotation = annotation
2369
Yury Selivanov2393dca2014-01-27 15:07:58 -05002370 if name is _empty:
2371 raise ValueError('name is a required attribute for Parameter')
2372
2373 if not isinstance(name, str):
2374 raise TypeError("name must be a str, not a {!r}".format(name))
2375
2376 if not name.isidentifier():
2377 raise ValueError('{!r} is not a valid parameter name'.format(name))
2378
2379 self._name = name
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002380
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002381 def __reduce__(self):
2382 return (type(self),
2383 (self._name, self._kind),
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002384 {'_default': self._default,
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002385 '_annotation': self._annotation})
2386
2387 def __setstate__(self, state):
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002388 self._default = state['_default']
2389 self._annotation = state['_annotation']
2390
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002391 @property
2392 def name(self):
2393 return self._name
2394
2395 @property
2396 def default(self):
2397 return self._default
2398
2399 @property
2400 def annotation(self):
2401 return self._annotation
2402
2403 @property
2404 def kind(self):
2405 return self._kind
2406
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002407 def replace(self, *, name=_void, kind=_void,
2408 annotation=_void, default=_void):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002409 """Creates a customized copy of the Parameter."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002410
2411 if name is _void:
2412 name = self._name
2413
2414 if kind is _void:
2415 kind = self._kind
2416
2417 if annotation is _void:
2418 annotation = self._annotation
2419
2420 if default is _void:
2421 default = self._default
2422
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002423 return type(self)(name, kind, default=default, annotation=annotation)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002424
2425 def __str__(self):
2426 kind = self.kind
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002427 formatted = self._name
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002428
2429 # Add annotation and default value
2430 if self._annotation is not _empty:
2431 formatted = '{}:{}'.format(formatted,
2432 formatannotation(self._annotation))
2433
2434 if self._default is not _empty:
2435 formatted = '{}={}'.format(formatted, repr(self._default))
2436
2437 if kind == _VAR_POSITIONAL:
2438 formatted = '*' + formatted
2439 elif kind == _VAR_KEYWORD:
2440 formatted = '**' + formatted
2441
2442 return formatted
2443
2444 def __repr__(self):
Yury Selivanovf229bc52015-05-15 12:53:56 -04002445 return '<{} "{}">'.format(self.__class__.__name__, self)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002446
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002447 def __hash__(self):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002448 return hash((self.name, self.kind, self.annotation, self.default))
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002449
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002450 def __eq__(self, other):
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002451 if self is other:
2452 return True
Serhiy Storchaka3018cc42015-07-18 23:19:05 +03002453 if not isinstance(other, Parameter):
2454 return NotImplemented
2455 return (self._name == other._name and
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002456 self._kind == other._kind and
2457 self._default == other._default and
2458 self._annotation == other._annotation)
2459
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002460
2461class BoundArguments:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002462 """Result of `Signature.bind` call. Holds the mapping of arguments
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002463 to the function's parameters.
2464
2465 Has the following public attributes:
2466
2467 * arguments : OrderedDict
2468 An ordered mutable mapping of parameters' names to arguments' values.
2469 Does not contain arguments' default values.
2470 * signature : Signature
2471 The Signature object that created this instance.
2472 * args : tuple
2473 Tuple of positional arguments values.
2474 * kwargs : dict
2475 Dict of keyword arguments values.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002476 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002477
Yury Selivanov6abe0322015-05-13 17:18:41 -04002478 __slots__ = ('arguments', '_signature', '__weakref__')
2479
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002480 def __init__(self, signature, arguments):
2481 self.arguments = arguments
2482 self._signature = signature
2483
2484 @property
2485 def signature(self):
2486 return self._signature
2487
2488 @property
2489 def args(self):
2490 args = []
2491 for param_name, param in self._signature.parameters.items():
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002492 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002493 break
2494
2495 try:
2496 arg = self.arguments[param_name]
2497 except KeyError:
2498 # We're done here. Other arguments
2499 # will be mapped in 'BoundArguments.kwargs'
2500 break
2501 else:
2502 if param.kind == _VAR_POSITIONAL:
2503 # *args
2504 args.extend(arg)
2505 else:
2506 # plain argument
2507 args.append(arg)
2508
2509 return tuple(args)
2510
2511 @property
2512 def kwargs(self):
2513 kwargs = {}
2514 kwargs_started = False
2515 for param_name, param in self._signature.parameters.items():
2516 if not kwargs_started:
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002517 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002518 kwargs_started = True
2519 else:
2520 if param_name not in self.arguments:
2521 kwargs_started = True
2522 continue
2523
2524 if not kwargs_started:
2525 continue
2526
2527 try:
2528 arg = self.arguments[param_name]
2529 except KeyError:
2530 pass
2531 else:
2532 if param.kind == _VAR_KEYWORD:
2533 # **kwargs
2534 kwargs.update(arg)
2535 else:
2536 # plain keyword argument
2537 kwargs[param_name] = arg
2538
2539 return kwargs
2540
Yury Selivanovb907a512015-05-16 13:45:09 -04002541 def apply_defaults(self):
2542 """Set default values for missing arguments.
2543
2544 For variable-positional arguments (*args) the default is an
2545 empty tuple.
2546
2547 For variable-keyword arguments (**kwargs) the default is an
2548 empty dict.
2549 """
2550 arguments = self.arguments
2551 if not arguments:
2552 return
2553 new_arguments = []
2554 for name, param in self._signature.parameters.items():
2555 try:
2556 new_arguments.append((name, arguments[name]))
2557 except KeyError:
2558 if param.default is not _empty:
2559 val = param.default
2560 elif param.kind is _VAR_POSITIONAL:
2561 val = ()
2562 elif param.kind is _VAR_KEYWORD:
2563 val = {}
2564 else:
2565 # This BoundArguments was likely produced by
2566 # Signature.bind_partial().
2567 continue
2568 new_arguments.append((name, val))
2569 self.arguments = OrderedDict(new_arguments)
2570
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002571 def __eq__(self, other):
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002572 if self is other:
2573 return True
Serhiy Storchaka3018cc42015-07-18 23:19:05 +03002574 if not isinstance(other, BoundArguments):
2575 return NotImplemented
2576 return (self.signature == other.signature and
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002577 self.arguments == other.arguments)
2578
Yury Selivanov6abe0322015-05-13 17:18:41 -04002579 def __setstate__(self, state):
2580 self._signature = state['_signature']
2581 self.arguments = state['arguments']
2582
2583 def __getstate__(self):
2584 return {'_signature': self._signature, 'arguments': self.arguments}
2585
Yury Selivanov3f6538f2015-05-14 18:47:17 -04002586 def __repr__(self):
2587 args = []
2588 for arg, value in self.arguments.items():
2589 args.append('{}={!r}'.format(arg, value))
Yury Selivanovf229bc52015-05-15 12:53:56 -04002590 return '<{} ({})>'.format(self.__class__.__name__, ', '.join(args))
Yury Selivanov3f6538f2015-05-14 18:47:17 -04002591
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002592
2593class Signature:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002594 """A Signature object represents the overall signature of a function.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002595 It stores a Parameter object for each parameter accepted by the
2596 function, as well as information specific to the function itself.
2597
2598 A Signature object has the following public attributes and methods:
2599
2600 * parameters : OrderedDict
2601 An ordered mapping of parameters' names to the corresponding
2602 Parameter objects (keyword-only arguments are in the same order
2603 as listed in `code.co_varnames`).
2604 * return_annotation : object
2605 The annotation for the return type of the function if specified.
2606 If the function has no annotation for its return type, this
Yury Selivanov8757ead2014-01-28 16:39:25 -05002607 attribute is set to `Signature.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002608 * bind(*args, **kwargs) -> BoundArguments
2609 Creates a mapping from positional and keyword arguments to
2610 parameters.
2611 * bind_partial(*args, **kwargs) -> BoundArguments
2612 Creates a partial mapping from positional and keyword arguments
2613 to parameters (simulating 'functools.partial' behavior.)
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002614 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002615
2616 __slots__ = ('_return_annotation', '_parameters')
2617
2618 _parameter_cls = Parameter
2619 _bound_arguments_cls = BoundArguments
2620
2621 empty = _empty
2622
2623 def __init__(self, parameters=None, *, return_annotation=_empty,
2624 __validate_parameters__=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002625 """Constructs Signature from the given list of Parameter
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002626 objects and 'return_annotation'. All arguments are optional.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002627 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002628
2629 if parameters is None:
2630 params = OrderedDict()
2631 else:
2632 if __validate_parameters__:
2633 params = OrderedDict()
2634 top_kind = _POSITIONAL_ONLY
Yury Selivanov07a9e452014-01-29 10:58:16 -05002635 kind_defaults = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002636
2637 for idx, param in enumerate(parameters):
2638 kind = param.kind
Yury Selivanov2393dca2014-01-27 15:07:58 -05002639 name = param.name
2640
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002641 if kind < top_kind:
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002642 msg = 'wrong parameter order: {!r} before {!r}'
Yury Selivanov2393dca2014-01-27 15:07:58 -05002643 msg = msg.format(top_kind, kind)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002644 raise ValueError(msg)
Yury Selivanov07a9e452014-01-29 10:58:16 -05002645 elif kind > top_kind:
2646 kind_defaults = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002647 top_kind = kind
2648
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002649 if kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD):
Yury Selivanov07a9e452014-01-29 10:58:16 -05002650 if param.default is _empty:
2651 if kind_defaults:
2652 # No default for this parameter, but the
2653 # previous parameter of the same kind had
2654 # a default
2655 msg = 'non-default argument follows default ' \
2656 'argument'
2657 raise ValueError(msg)
2658 else:
2659 # There is a default for this parameter.
2660 kind_defaults = True
2661
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002662 if name in params:
2663 msg = 'duplicate parameter name: {!r}'.format(name)
2664 raise ValueError(msg)
Yury Selivanov2393dca2014-01-27 15:07:58 -05002665
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002666 params[name] = param
2667 else:
2668 params = OrderedDict(((param.name, param)
2669 for param in parameters))
2670
2671 self._parameters = types.MappingProxyType(params)
2672 self._return_annotation = return_annotation
2673
2674 @classmethod
2675 def from_function(cls, func):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002676 """Constructs Signature for the given python function."""
Yury Selivanov57c74fc2015-05-20 23:07:02 -04002677
2678 warnings.warn("inspect.Signature.from_function() is deprecated, "
Berker Peksagb5601582015-05-21 23:40:54 +03002679 "use Signature.from_callable()",
2680 DeprecationWarning, stacklevel=2)
Yury Selivanovcf45f022015-05-20 14:38:50 -04002681 return _signature_from_function(cls, func)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002682
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002683 @classmethod
2684 def from_builtin(cls, func):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002685 """Constructs Signature for the given builtin function."""
Yury Selivanov57c74fc2015-05-20 23:07:02 -04002686
2687 warnings.warn("inspect.Signature.from_builtin() is deprecated, "
Berker Peksagb5601582015-05-21 23:40:54 +03002688 "use Signature.from_callable()",
2689 DeprecationWarning, stacklevel=2)
Yury Selivanov57d240e2014-02-19 16:27:23 -05002690 return _signature_from_builtin(cls, func)
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002691
Yury Selivanovda396452014-03-27 12:09:24 -04002692 @classmethod
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002693 def from_callable(cls, obj, *, follow_wrapped=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002694 """Constructs Signature for the given callable object."""
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002695 return _signature_from_callable(obj, sigcls=cls,
2696 follow_wrapper_chains=follow_wrapped)
Yury Selivanovda396452014-03-27 12:09:24 -04002697
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002698 @property
2699 def parameters(self):
2700 return self._parameters
2701
2702 @property
2703 def return_annotation(self):
2704 return self._return_annotation
2705
2706 def replace(self, *, parameters=_void, return_annotation=_void):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002707 """Creates a customized copy of the Signature.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002708 Pass 'parameters' and/or 'return_annotation' arguments
2709 to override them in the new copy.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002710 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002711
2712 if parameters is _void:
2713 parameters = self.parameters.values()
2714
2715 if return_annotation is _void:
2716 return_annotation = self._return_annotation
2717
2718 return type(self)(parameters,
2719 return_annotation=return_annotation)
2720
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002721 def _hash_basis(self):
2722 params = tuple(param for param in self.parameters.values()
2723 if param.kind != _KEYWORD_ONLY)
2724
2725 kwo_params = {param.name: param for param in self.parameters.values()
2726 if param.kind == _KEYWORD_ONLY}
2727
2728 return params, kwo_params, self.return_annotation
2729
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002730 def __hash__(self):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002731 params, kwo_params, return_annotation = self._hash_basis()
2732 kwo_params = frozenset(kwo_params.values())
2733 return hash((params, kwo_params, return_annotation))
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002734
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002735 def __eq__(self, other):
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002736 if self is other:
2737 return True
Serhiy Storchaka3018cc42015-07-18 23:19:05 +03002738 if not isinstance(other, Signature):
2739 return NotImplemented
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002740 return self._hash_basis() == other._hash_basis()
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002741
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002742 def _bind(self, args, kwargs, *, partial=False):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002743 """Private method. Don't use directly."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002744
2745 arguments = OrderedDict()
2746
2747 parameters = iter(self.parameters.values())
2748 parameters_ex = ()
2749 arg_vals = iter(args)
2750
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002751 while True:
2752 # Let's iterate through the positional arguments and corresponding
2753 # parameters
2754 try:
2755 arg_val = next(arg_vals)
2756 except StopIteration:
2757 # No more positional arguments
2758 try:
2759 param = next(parameters)
2760 except StopIteration:
2761 # No more parameters. That's it. Just need to check that
2762 # we have no `kwargs` after this while loop
2763 break
2764 else:
2765 if param.kind == _VAR_POSITIONAL:
2766 # That's OK, just empty *args. Let's start parsing
2767 # kwargs
2768 break
2769 elif param.name in kwargs:
2770 if param.kind == _POSITIONAL_ONLY:
2771 msg = '{arg!r} parameter is positional only, ' \
2772 'but was passed as a keyword'
2773 msg = msg.format(arg=param.name)
2774 raise TypeError(msg) from None
2775 parameters_ex = (param,)
2776 break
2777 elif (param.kind == _VAR_KEYWORD or
2778 param.default is not _empty):
2779 # That's fine too - we have a default value for this
2780 # parameter. So, lets start parsing `kwargs`, starting
2781 # with the current parameter
2782 parameters_ex = (param,)
2783 break
2784 else:
Yury Selivanov38b0d5a2014-01-28 17:27:39 -05002785 # No default, not VAR_KEYWORD, not VAR_POSITIONAL,
2786 # not in `kwargs`
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002787 if partial:
2788 parameters_ex = (param,)
2789 break
2790 else:
Yury Selivanov86872752015-05-19 00:27:49 -04002791 msg = 'missing a required argument: {arg!r}'
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002792 msg = msg.format(arg=param.name)
2793 raise TypeError(msg) from None
2794 else:
2795 # We have a positional argument to process
2796 try:
2797 param = next(parameters)
2798 except StopIteration:
2799 raise TypeError('too many positional arguments') from None
2800 else:
2801 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
2802 # Looks like we have no parameter for this positional
2803 # argument
Yury Selivanov86872752015-05-19 00:27:49 -04002804 raise TypeError(
2805 'too many positional arguments') from None
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002806
2807 if param.kind == _VAR_POSITIONAL:
2808 # We have an '*args'-like argument, let's fill it with
2809 # all positional arguments we have left and move on to
2810 # the next phase
2811 values = [arg_val]
2812 values.extend(arg_vals)
2813 arguments[param.name] = tuple(values)
2814 break
2815
2816 if param.name in kwargs:
Yury Selivanov86872752015-05-19 00:27:49 -04002817 raise TypeError(
2818 'multiple values for argument {arg!r}'.format(
2819 arg=param.name)) from None
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002820
2821 arguments[param.name] = arg_val
2822
2823 # Now, we iterate through the remaining parameters to process
2824 # keyword arguments
2825 kwargs_param = None
2826 for param in itertools.chain(parameters_ex, parameters):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002827 if param.kind == _VAR_KEYWORD:
2828 # Memorize that we have a '**kwargs'-like parameter
2829 kwargs_param = param
2830 continue
2831
Yury Selivanov38b0d5a2014-01-28 17:27:39 -05002832 if param.kind == _VAR_POSITIONAL:
2833 # Named arguments don't refer to '*args'-like parameters.
2834 # We only arrive here if the positional arguments ended
2835 # before reaching the last parameter before *args.
2836 continue
2837
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002838 param_name = param.name
2839 try:
2840 arg_val = kwargs.pop(param_name)
2841 except KeyError:
2842 # We have no value for this parameter. It's fine though,
2843 # if it has a default value, or it is an '*args'-like
2844 # parameter, left alone by the processing of positional
2845 # arguments.
2846 if (not partial and param.kind != _VAR_POSITIONAL and
2847 param.default is _empty):
Yury Selivanov86872752015-05-19 00:27:49 -04002848 raise TypeError('missing a required argument: {arg!r}'. \
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002849 format(arg=param_name)) from None
2850
2851 else:
Yury Selivanov9b9ac952014-01-28 20:54:28 -05002852 if param.kind == _POSITIONAL_ONLY:
2853 # This should never happen in case of a properly built
2854 # Signature object (but let's have this check here
2855 # to ensure correct behaviour just in case)
2856 raise TypeError('{arg!r} parameter is positional only, '
2857 'but was passed as a keyword'. \
2858 format(arg=param.name))
2859
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002860 arguments[param_name] = arg_val
2861
2862 if kwargs:
2863 if kwargs_param is not None:
2864 # Process our '**kwargs'-like parameter
2865 arguments[kwargs_param.name] = kwargs
2866 else:
Yury Selivanov86872752015-05-19 00:27:49 -04002867 raise TypeError(
2868 'got an unexpected keyword argument {arg!r}'.format(
2869 arg=next(iter(kwargs))))
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002870
2871 return self._bound_arguments_cls(self, arguments)
2872
Yury Selivanovc45873e2014-01-29 12:10:27 -05002873 def bind(*args, **kwargs):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002874 """Get a BoundArguments object, that maps the passed `args`
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002875 and `kwargs` to the function's signature. Raises `TypeError`
2876 if the passed arguments can not be bound.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002877 """
Yury Selivanovc45873e2014-01-29 12:10:27 -05002878 return args[0]._bind(args[1:], kwargs)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002879
Yury Selivanovc45873e2014-01-29 12:10:27 -05002880 def bind_partial(*args, **kwargs):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002881 """Get a BoundArguments object, that partially maps the
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002882 passed `args` and `kwargs` to the function's signature.
2883 Raises `TypeError` if the passed arguments can not be bound.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002884 """
Yury Selivanovc45873e2014-01-29 12:10:27 -05002885 return args[0]._bind(args[1:], kwargs, partial=True)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002886
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002887 def __reduce__(self):
2888 return (type(self),
2889 (tuple(self._parameters.values()),),
2890 {'_return_annotation': self._return_annotation})
2891
2892 def __setstate__(self, state):
2893 self._return_annotation = state['_return_annotation']
2894
Yury Selivanov374375d2014-03-27 12:41:53 -04002895 def __repr__(self):
Yury Selivanovf229bc52015-05-15 12:53:56 -04002896 return '<{} {}>'.format(self.__class__.__name__, self)
Yury Selivanov374375d2014-03-27 12:41:53 -04002897
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002898 def __str__(self):
2899 result = []
Yury Selivanov2393dca2014-01-27 15:07:58 -05002900 render_pos_only_separator = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002901 render_kw_only_separator = True
Yury Selivanov2393dca2014-01-27 15:07:58 -05002902 for param in self.parameters.values():
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002903 formatted = str(param)
2904
2905 kind = param.kind
Yury Selivanov2393dca2014-01-27 15:07:58 -05002906
2907 if kind == _POSITIONAL_ONLY:
2908 render_pos_only_separator = True
2909 elif render_pos_only_separator:
2910 # It's not a positional-only parameter, and the flag
2911 # is set to 'True' (there were pos-only params before.)
2912 result.append('/')
2913 render_pos_only_separator = False
2914
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002915 if kind == _VAR_POSITIONAL:
2916 # OK, we have an '*args'-like parameter, so we won't need
2917 # a '*' to separate keyword-only arguments
2918 render_kw_only_separator = False
2919 elif kind == _KEYWORD_ONLY and render_kw_only_separator:
2920 # We have a keyword-only parameter to render and we haven't
2921 # rendered an '*args'-like parameter before, so add a '*'
2922 # separator to the parameters list ("foo(arg1, *, arg2)" case)
2923 result.append('*')
2924 # This condition should be only triggered once, so
2925 # reset the flag
2926 render_kw_only_separator = False
2927
2928 result.append(formatted)
2929
Yury Selivanov2393dca2014-01-27 15:07:58 -05002930 if render_pos_only_separator:
2931 # There were only positional-only parameters, hence the
2932 # flag was not reset to 'False'
2933 result.append('/')
2934
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002935 rendered = '({})'.format(', '.join(result))
2936
2937 if self.return_annotation is not _empty:
2938 anno = formatannotation(self.return_annotation)
2939 rendered += ' -> {}'.format(anno)
2940
2941 return rendered
Nick Coghlanf94a16b2013-09-22 22:46:49 +10002942
Yury Selivanovda396452014-03-27 12:09:24 -04002943
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002944def signature(obj, *, follow_wrapped=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002945 """Get a signature object for the passed callable."""
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002946 return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
Yury Selivanovda396452014-03-27 12:09:24 -04002947
2948
Nick Coghlanf94a16b2013-09-22 22:46:49 +10002949def _main():
2950 """ Logic for inspecting an object given at command line """
2951 import argparse
2952 import importlib
2953
2954 parser = argparse.ArgumentParser()
2955 parser.add_argument(
2956 'object',
2957 help="The object to be analysed. "
2958 "It supports the 'module:qualname' syntax")
2959 parser.add_argument(
2960 '-d', '--details', action='store_true',
2961 help='Display info about the module rather than its source code')
2962
2963 args = parser.parse_args()
2964
2965 target = args.object
2966 mod_name, has_attrs, attrs = target.partition(":")
2967 try:
2968 obj = module = importlib.import_module(mod_name)
2969 except Exception as exc:
2970 msg = "Failed to import {} ({}: {})".format(mod_name,
2971 type(exc).__name__,
2972 exc)
2973 print(msg, file=sys.stderr)
2974 exit(2)
2975
2976 if has_attrs:
2977 parts = attrs.split(".")
2978 obj = module
2979 for part in parts:
2980 obj = getattr(obj, part)
2981
2982 if module.__name__ in sys.builtin_module_names:
2983 print("Can't get info for builtin modules.", file=sys.stderr)
2984 exit(1)
2985
2986 if args.details:
2987 print('Target: {}'.format(target))
2988 print('Origin: {}'.format(getsourcefile(module)))
2989 print('Cached: {}'.format(module.__cached__))
2990 if obj is module:
2991 print('Loader: {}'.format(repr(module.__loader__)))
2992 if hasattr(module, '__path__'):
2993 print('Submodule search path: {}'.format(module.__path__))
2994 else:
2995 try:
2996 __, lineno = findsource(obj)
2997 except Exception:
2998 pass
2999 else:
3000 print('Line: {}'.format(lineno))
3001
3002 print('\n')
3003 else:
3004 print(getsource(obj))
3005
3006
3007if __name__ == "__main__":
3008 _main()