blob: 7615e5277f78074b39dba4fdb540bc44be83fce6 [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
Berker Peksagfa3922c2015-07-31 04:11:29 +030019 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__
Serhiy Storchakaac4bdcc2015-10-29 08:15:50 +0200530 # Should be tested before isdatadescriptor().
531 elif isinstance(obj, property):
532 func = obj.fget
533 name = func.__name__
534 cls = _findclass(func)
535 if cls is None or getattr(cls, name) is not obj:
536 return None
Serhiy Storchaka5cf2b7252015-04-03 22:38:53 +0300537 elif ismethoddescriptor(obj) or isdatadescriptor(obj):
538 name = obj.__name__
539 cls = obj.__objclass__
540 if getattr(cls, name) is not obj:
541 return None
Serhiy Storchaka5cf2b7252015-04-03 22:38:53 +0300542 else:
543 return None
544
545 for base in cls.__mro__:
546 try:
547 doc = getattr(base, name).__doc__
548 except AttributeError:
549 continue
550 if doc is not None:
551 return doc
552 return None
553
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000554def getdoc(object):
555 """Get the documentation string for an object.
556
557 All tabs are expanded to spaces. To clean up docstrings that are
558 indented to line up with blocks of code, any whitespace than can be
559 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000560 try:
561 doc = object.__doc__
562 except AttributeError:
563 return None
Serhiy Storchaka5cf2b7252015-04-03 22:38:53 +0300564 if doc is None:
565 try:
566 doc = _finddoc(object)
567 except (AttributeError, TypeError):
568 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000569 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000570 return None
Georg Brandl0c77a822008-06-10 16:37:50 +0000571 return cleandoc(doc)
572
573def cleandoc(doc):
574 """Clean up indentation from docstrings.
575
576 Any whitespace that can be uniformly removed from the second line
577 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000578 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000579 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000580 except UnicodeError:
581 return None
582 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000583 # Find minimum indentation of any non-blank lines after first line.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000584 margin = sys.maxsize
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000585 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000586 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000587 if content:
588 indent = len(line) - content
589 margin = min(margin, indent)
590 # Remove indentation.
591 if lines:
592 lines[0] = lines[0].lstrip()
Christian Heimesa37d4c62007-12-04 23:02:19 +0000593 if margin < sys.maxsize:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000594 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000595 # Remove any trailing or leading blank lines.
596 while lines and not lines[-1]:
597 lines.pop()
598 while lines and not lines[0]:
599 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000600 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000601
602def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000603 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000604 if ismodule(object):
605 if hasattr(object, '__file__'):
606 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000607 raise TypeError('{!r} is a built-in module'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000608 if isclass(object):
Yury Selivanov2eed8b72014-01-27 13:24:56 -0500609 if hasattr(object, '__module__'):
610 object = sys.modules.get(object.__module__)
611 if hasattr(object, '__file__'):
612 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000613 raise TypeError('{!r} is a built-in class'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000614 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000615 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000616 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000617 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000618 if istraceback(object):
619 object = object.tb_frame
620 if isframe(object):
621 object = object.f_code
622 if iscode(object):
623 return object.co_filename
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000624 raise TypeError('{!r} is not a module, class, method, '
625 'function, traceback, frame, or code object'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000626
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000627def getmodulename(path):
628 """Return the module name for a given file, or None."""
Nick Coghlan76e07702012-07-18 23:14:57 +1000629 fname = os.path.basename(path)
630 # Check for paths that look like an actual module file
631 suffixes = [(-len(suffix), suffix)
632 for suffix in importlib.machinery.all_suffixes()]
633 suffixes.sort() # try longest suffixes first, in case they overlap
634 for neglen, suffix in suffixes:
635 if fname.endswith(suffix):
636 return fname[:neglen]
637 return None
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000638
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000639def getsourcefile(object):
R. David Murraya1b37402010-06-17 02:04:29 +0000640 """Return the filename that can be used to locate an object's source.
641 Return None if no way can be identified to get the source.
642 """
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000643 filename = getfile(object)
Brett Cannoncb66eb02012-05-11 12:58:42 -0400644 all_bytecode_suffixes = importlib.machinery.DEBUG_BYTECODE_SUFFIXES[:]
645 all_bytecode_suffixes += importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES[:]
646 if any(filename.endswith(s) for s in all_bytecode_suffixes):
647 filename = (os.path.splitext(filename)[0] +
648 importlib.machinery.SOURCE_SUFFIXES[0])
649 elif any(filename.endswith(s) for s in
650 importlib.machinery.EXTENSION_SUFFIXES):
651 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000652 if os.path.exists(filename):
653 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000654 # only return a non-existent filename if the module has a PEP 302 loader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400655 if getattr(getmodule(object, filename), '__loader__', None) is not None:
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000656 return filename
R. David Murraya1b37402010-06-17 02:04:29 +0000657 # or it is in the linecache
658 if filename in linecache.cache:
659 return filename
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000660
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000661def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000662 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000663
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000664 The idea is for each object to have a unique origin, so this routine
665 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000666 if _filename is None:
667 _filename = getsourcefile(object) or getfile(object)
668 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000669
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000670modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000671_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000672
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000674 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000675 if ismodule(object):
676 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000677 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000678 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000679 # Try the filename to modulename cache
680 if _filename is not None and _filename in modulesbyfile:
681 return sys.modules.get(modulesbyfile[_filename])
682 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000683 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000684 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000685 except TypeError:
686 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000687 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000688 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000689 # Update the filename to module name cache and check yet again
690 # Copy sys.modules in order to cope with changes while iterating
Éric Araujoa74f8ef2011-11-29 16:58:53 +0100691 for modname, module in list(sys.modules.items()):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000692 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000693 f = module.__file__
694 if f == _filesbymodname.get(modname, None):
695 # Have already mapped this module, so skip it
696 continue
697 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000698 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000699 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000700 modulesbyfile[f] = modulesbyfile[
701 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000702 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000703 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000704 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000705 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000706 if not hasattr(object, '__name__'):
707 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000708 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000709 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000710 if mainobject is object:
711 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000712 # Check builtins
Georg Brandl1a3284e2007-12-02 09:40:06 +0000713 builtin = sys.modules['builtins']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000714 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000715 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000716 if builtinobject is object:
717 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000718
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000719def findsource(object):
720 """Return the entire source file and starting line number for an object.
721
722 The argument may be a module, class, method, function, traceback, frame,
723 or code object. The source code is returned as a list of all the lines
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200724 in the file and the line number indexes a line in that list. An OSError
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000725 is raised if the source code cannot be retrieved."""
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500726
Yury Selivanovef1e7502014-12-08 16:05:34 -0500727 file = getsourcefile(object)
728 if file:
729 # Invalidate cache if needed.
730 linecache.checkcache(file)
731 else:
732 file = getfile(object)
733 # Allow filenames in form of "<something>" to pass through.
734 # `doctest` monkeypatches `linecache` module to enable
735 # inspection, so let `linecache.getlines` to be called.
736 if not (file.startswith('<') and file.endswith('>')):
737 raise OSError('source code not available')
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500738
Thomas Wouters89f507f2006-12-13 04:49:30 +0000739 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000740 if module:
741 lines = linecache.getlines(file, module.__dict__)
742 else:
743 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000744 if not lines:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200745 raise OSError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000746
747 if ismodule(object):
748 return lines, 0
749
750 if isclass(object):
751 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000752 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
753 # make some effort to find the best matching class definition:
754 # use the one with the least indentation, which is the one
755 # that's most probably not inside a function definition.
756 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000757 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000758 match = pat.match(lines[i])
759 if match:
760 # if it's at toplevel, it's already the best one
761 if lines[i][0] == 'c':
762 return lines, i
763 # else add whitespace to candidate list
764 candidates.append((match.group(1), i))
765 if candidates:
766 # this will sort by whitespace, and by line number,
767 # less whitespace first
768 candidates.sort()
769 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000770 else:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200771 raise OSError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000772
773 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000774 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000775 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000776 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000777 if istraceback(object):
778 object = object.tb_frame
779 if isframe(object):
780 object = object.f_code
781 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000782 if not hasattr(object, 'co_firstlineno'):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200783 raise OSError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000784 lnum = object.co_firstlineno - 1
Yury Selivanove4e811d2015-07-21 19:01:52 +0300785 pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000786 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000787 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000788 lnum = lnum - 1
789 return lines, lnum
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200790 raise OSError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000791
792def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000793 """Get lines of comments immediately preceding an object's source code.
794
795 Returns None when source can't be found.
796 """
797 try:
798 lines, lnum = findsource(object)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200799 except (OSError, TypeError):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000800 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000801
802 if ismodule(object):
803 # Look for a comment block at the top of the file.
804 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000805 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000806 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000807 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000808 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000809 comments = []
810 end = start
811 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000812 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000813 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000814 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000815
816 # Look for a preceding block of comments at the same indentation.
817 elif lnum > 0:
818 indent = indentsize(lines[lnum])
819 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000820 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000821 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000822 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000823 if end > 0:
824 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000825 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000826 while comment[:1] == '#' and indentsize(lines[end]) == indent:
827 comments[:0] = [comment]
828 end = end - 1
829 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000830 comment = lines[end].expandtabs().lstrip()
831 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000832 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000833 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000834 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000835 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000836
Tim Peters4efb6e92001-06-29 23:51:08 +0000837class EndOfBlock(Exception): pass
838
839class BlockFinder:
840 """Provide a tokeneater() method to detect the end of a code block."""
841 def __init__(self):
842 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000843 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000844 self.started = False
845 self.passline = False
Meador Inge5b718d72015-07-23 22:49:37 -0500846 self.indecorator = False
847 self.decoratorhasargs = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000848 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000849
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000850 def tokeneater(self, type, token, srowcol, erowcol, line):
Meador Inge5b718d72015-07-23 22:49:37 -0500851 if not self.started and not self.indecorator:
852 # skip any decorators
853 if token == "@":
854 self.indecorator = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000855 # look for the first "def", "class" or "lambda"
Meador Inge5b718d72015-07-23 22:49:37 -0500856 elif token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000857 if token == "lambda":
858 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000859 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000860 self.passline = True # skip to the end of the line
Meador Inge5b718d72015-07-23 22:49:37 -0500861 elif token == "(":
862 if self.indecorator:
863 self.decoratorhasargs = True
864 elif token == ")":
865 if self.indecorator:
866 self.indecorator = False
867 self.decoratorhasargs = False
Tim Peters4efb6e92001-06-29 23:51:08 +0000868 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000869 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000870 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000871 if self.islambda: # lambdas always end at the first NEWLINE
872 raise EndOfBlock
Meador Inge5b718d72015-07-23 22:49:37 -0500873 # hitting a NEWLINE when in a decorator without args
874 # ends the decorator
875 if self.indecorator and not self.decoratorhasargs:
876 self.indecorator = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000877 elif self.passline:
878 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000879 elif type == tokenize.INDENT:
880 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000881 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000882 elif type == tokenize.DEDENT:
883 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000884 # the end of matching indent/dedent pairs end a block
885 # (note that this only works for "def"/"class" blocks,
886 # not e.g. for "if: else:" or "try: finally:" blocks)
887 if self.indent <= 0:
888 raise EndOfBlock
889 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
890 # any other token on the same indentation level end the previous
891 # block as well, except the pseudo-tokens COMMENT and NL.
892 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000893
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000894def getblock(lines):
895 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000896 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000897 try:
Trent Nelson428de652008-03-18 22:41:35 +0000898 tokens = tokenize.generate_tokens(iter(lines).__next__)
899 for _token in tokens:
900 blockfinder.tokeneater(*_token)
Armin Rigodd5c0232005-09-25 11:45:45 +0000901 except (EndOfBlock, IndentationError):
902 pass
903 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000904
905def getsourcelines(object):
906 """Return a list of source lines and starting line number for an object.
907
908 The argument may be a module, class, method, function, traceback, frame,
909 or code object. The source code is returned as a list of the lines
910 corresponding to the object and the line number indicates where in the
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200911 original source file the first line of code was found. An OSError is
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000912 raised if the source code cannot be retrieved."""
Yury Selivanov081bbf62014-09-26 17:34:54 -0400913 object = unwrap(object)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000914 lines, lnum = findsource(object)
915
Meador Inge5b718d72015-07-23 22:49:37 -0500916 if ismodule(object):
917 return lines, 0
918 else:
919 return getblock(lines[lnum:]), lnum + 1
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000920
921def getsource(object):
922 """Return the text of the source code for an object.
923
924 The argument may be a module, class, method, function, traceback, frame,
925 or code object. The source code is returned as a single string. An
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200926 OSError is raised if the source code cannot be retrieved."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000927 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000928 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000929
930# --------------------------------------------------- class tree extraction
931def walktree(classes, children, parent):
932 """Recursive helper function for getclasstree()."""
933 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000934 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000935 for c in classes:
936 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000937 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000938 results.append(walktree(children[c], children, c))
939 return results
940
Georg Brandl5ce83a02009-06-01 17:23:51 +0000941def getclasstree(classes, unique=False):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000942 """Arrange the given list of classes into a hierarchy of nested lists.
943
944 Where a nested list appears, it contains classes derived from the class
945 whose entry immediately precedes the list. Each entry is a 2-tuple
946 containing a class and a tuple of its base classes. If the 'unique'
947 argument is true, exactly one entry appears in the returned structure
948 for each class in the given list. Otherwise, classes using multiple
949 inheritance and their descendants will appear multiple times."""
950 children = {}
951 roots = []
952 for c in classes:
953 if c.__bases__:
954 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000955 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000956 children[parent] = []
Serhiy Storchaka362c1b52013-09-05 17:14:32 +0300957 if c not in children[parent]:
958 children[parent].append(c)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000959 if unique and parent in classes: break
960 elif c not in roots:
961 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000962 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000963 if parent not in classes:
964 roots.append(parent)
965 return walktree(roots, children, None)
966
967# ------------------------------------------------ argument list extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000968Arguments = namedtuple('Arguments', 'args, varargs, varkw')
969
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000970def getargs(co):
971 """Get information about the arguments accepted by a code object.
972
Guido van Rossum2e65f892007-02-28 22:03:49 +0000973 Three things are returned: (args, varargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000974 'args' is the list of argument names. Keyword-only arguments are
975 appended. 'varargs' and 'varkw' are the names of the * and **
976 arguments or None."""
Guido van Rossum2e65f892007-02-28 22:03:49 +0000977 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000978 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000979
980def _getfullargs(co):
981 """Get information about the arguments accepted by a code object.
982
983 Four things are returned: (args, varargs, kwonlyargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000984 'args' and 'kwonlyargs' are lists of argument names, and 'varargs'
985 and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000986
987 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000988 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000989
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000990 nargs = co.co_argcount
991 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000992 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000993 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000994 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000995 step = 0
996
Guido van Rossum2e65f892007-02-28 22:03:49 +0000997 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000998 varargs = None
999 if co.co_flags & CO_VARARGS:
1000 varargs = co.co_varnames[nargs]
1001 nargs = nargs + 1
1002 varkw = None
1003 if co.co_flags & CO_VARKEYWORDS:
1004 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +00001005 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001006
Christian Heimes25bb7832008-01-11 16:17:00 +00001007FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +00001008 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +00001009
1010def getfullargspec(func):
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001011 """Get the names and default values of a callable object's arguments.
Guido van Rossum2e65f892007-02-28 22:03:49 +00001012
Brett Cannon504d8852007-09-07 02:12:14 +00001013 A tuple of seven things is returned:
1014 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001015 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +00001016 'varargs' and 'varkw' are the names of the * and ** arguments or None.
1017 'defaults' is an n-tuple of the default values of the last n arguments.
1018 'kwonlyargs' is a list of keyword-only argument names.
1019 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
1020 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001021
Yury Selivanov3cfec2e2015-05-22 11:38:38 -04001022 This function is deprecated, use inspect.signature() instead.
Jeremy Hylton64967882003-06-27 18:14:39 +00001023 """
1024
Yury Selivanov57d240e2014-02-19 16:27:23 -05001025 try:
1026 # Re: `skip_bound_arg=False`
1027 #
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001028 # There is a notable difference in behaviour between getfullargspec
1029 # and Signature: the former always returns 'self' parameter for bound
1030 # methods, whereas the Signature always shows the actual calling
1031 # signature of the passed object.
1032 #
1033 # To simulate this behaviour, we "unbind" bound methods, to trick
1034 # inspect.signature to always return their first parameter ("self",
1035 # usually)
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001036
Yury Selivanov57d240e2014-02-19 16:27:23 -05001037 # Re: `follow_wrapper_chains=False`
1038 #
1039 # getfullargspec() historically ignored __wrapped__ attributes,
1040 # so we ensure that remains the case in 3.3+
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001041
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001042 sig = _signature_from_callable(func,
1043 follow_wrapper_chains=False,
1044 skip_bound_arg=False,
1045 sigcls=Signature)
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001046 except Exception as ex:
1047 # Most of the times 'signature' will raise ValueError.
1048 # But, it can also raise AttributeError, and, maybe something
1049 # else. So to be fully backwards compatible, we catch all
1050 # possible exceptions here, and reraise a TypeError.
1051 raise TypeError('unsupported callable') from ex
1052
1053 args = []
1054 varargs = None
1055 varkw = None
1056 kwonlyargs = []
1057 defaults = ()
1058 annotations = {}
1059 defaults = ()
1060 kwdefaults = {}
1061
1062 if sig.return_annotation is not sig.empty:
1063 annotations['return'] = sig.return_annotation
1064
1065 for param in sig.parameters.values():
1066 kind = param.kind
1067 name = param.name
1068
1069 if kind is _POSITIONAL_ONLY:
1070 args.append(name)
1071 elif kind is _POSITIONAL_OR_KEYWORD:
1072 args.append(name)
1073 if param.default is not param.empty:
1074 defaults += (param.default,)
1075 elif kind is _VAR_POSITIONAL:
1076 varargs = name
1077 elif kind is _KEYWORD_ONLY:
1078 kwonlyargs.append(name)
1079 if param.default is not param.empty:
1080 kwdefaults[name] = param.default
1081 elif kind is _VAR_KEYWORD:
1082 varkw = name
1083
1084 if param.annotation is not param.empty:
1085 annotations[name] = param.annotation
1086
1087 if not kwdefaults:
1088 # compatibility with 'func.__kwdefaults__'
1089 kwdefaults = None
1090
1091 if not defaults:
1092 # compatibility with 'func.__defaults__'
1093 defaults = None
1094
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001095 return FullArgSpec(args, varargs, varkw, defaults,
1096 kwonlyargs, kwdefaults, annotations)
1097
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001098
Christian Heimes25bb7832008-01-11 16:17:00 +00001099ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
1100
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001101def getargvalues(frame):
1102 """Get information about arguments passed into a particular frame.
1103
1104 A tuple of four things is returned: (args, varargs, varkw, locals).
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001105 'args' is a list of the argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001106 'varargs' and 'varkw' are the names of the * and ** arguments or None.
1107 'locals' is the locals dictionary of the given frame."""
1108 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001109 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001110
Guido van Rossum2e65f892007-02-28 22:03:49 +00001111def formatannotation(annotation, base_module=None):
1112 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +00001113 if annotation.__module__ in ('builtins', base_module):
Serhiy Storchaka521e5862014-07-22 15:00:37 +03001114 return annotation.__qualname__
1115 return annotation.__module__+'.'+annotation.__qualname__
Guido van Rossum2e65f892007-02-28 22:03:49 +00001116 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001117
Guido van Rossum2e65f892007-02-28 22:03:49 +00001118def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001119 module = getattr(object, '__module__', None)
1120 def _formatannotation(annotation):
1121 return formatannotation(annotation, module)
1122 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +00001123
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001124def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +00001125 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001126 formatarg=str,
1127 formatvarargs=lambda name: '*' + name,
1128 formatvarkw=lambda name: '**' + name,
1129 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +00001130 formatreturns=lambda text: ' -> ' + text,
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001131 formatannotation=formatannotation):
Berker Peksagfa3922c2015-07-31 04:11:29 +03001132 """Format an argument spec from the values returned by getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001133
Guido van Rossum2e65f892007-02-28 22:03:49 +00001134 The first seven arguments are (args, varargs, varkw, defaults,
1135 kwonlyargs, kwonlydefaults, annotations). The other five arguments
1136 are the corresponding optional formatting functions that are called to
1137 turn names and values into strings. The last argument is an optional
1138 function to format the sequence of arguments."""
1139 def formatargandannotation(arg):
1140 result = formatarg(arg)
1141 if arg in annotations:
1142 result += ': ' + formatannotation(annotations[arg])
1143 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001144 specs = []
1145 if defaults:
1146 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +00001147 for i, arg in enumerate(args):
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001148 spec = formatargandannotation(arg)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001149 if defaults and i >= firstdefault:
1150 spec = spec + formatvalue(defaults[i - firstdefault])
1151 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +00001152 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001153 specs.append(formatvarargs(formatargandannotation(varargs)))
1154 else:
1155 if kwonlyargs:
1156 specs.append('*')
1157 if kwonlyargs:
1158 for kwonlyarg in kwonlyargs:
1159 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +00001160 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001161 spec += formatvalue(kwonlydefaults[kwonlyarg])
1162 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +00001163 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001164 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001165 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +00001166 if 'return' in annotations:
1167 result += formatreturns(formatannotation(annotations['return']))
1168 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001169
1170def formatargvalues(args, varargs, varkw, locals,
1171 formatarg=str,
1172 formatvarargs=lambda name: '*' + name,
1173 formatvarkw=lambda name: '**' + name,
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001174 formatvalue=lambda value: '=' + repr(value)):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001175 """Format an argument spec from the 4 values returned by getargvalues.
1176
1177 The first four arguments are (args, varargs, varkw, locals). The
1178 next four arguments are the corresponding optional formatting functions
1179 that are called to turn names and values into strings. The ninth
1180 argument is an optional function to format the sequence of arguments."""
1181 def convert(name, locals=locals,
1182 formatarg=formatarg, formatvalue=formatvalue):
1183 return formatarg(name) + formatvalue(locals[name])
1184 specs = []
1185 for i in range(len(args)):
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001186 specs.append(convert(args[i]))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001187 if varargs:
1188 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
1189 if varkw:
1190 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001191 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001192
Benjamin Petersone109c702011-06-24 09:37:26 -05001193def _missing_arguments(f_name, argnames, pos, values):
1194 names = [repr(name) for name in argnames if name not in values]
1195 missing = len(names)
1196 if missing == 1:
1197 s = names[0]
1198 elif missing == 2:
1199 s = "{} and {}".format(*names)
1200 else:
Yury Selivanovdccfa132014-03-27 18:42:52 -04001201 tail = ", {} and {}".format(*names[-2:])
Benjamin Petersone109c702011-06-24 09:37:26 -05001202 del names[-2:]
1203 s = ", ".join(names) + tail
1204 raise TypeError("%s() missing %i required %s argument%s: %s" %
1205 (f_name, missing,
1206 "positional" if pos else "keyword-only",
1207 "" if missing == 1 else "s", s))
1208
1209def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
Benjamin Petersonb204a422011-06-05 22:04:07 -05001210 atleast = len(args) - defcount
Benjamin Petersonb204a422011-06-05 22:04:07 -05001211 kwonly_given = len([arg for arg in kwonly if arg in values])
1212 if varargs:
1213 plural = atleast != 1
1214 sig = "at least %d" % (atleast,)
1215 elif defcount:
1216 plural = True
1217 sig = "from %d to %d" % (atleast, len(args))
1218 else:
1219 plural = len(args) != 1
1220 sig = str(len(args))
1221 kwonly_sig = ""
1222 if kwonly_given:
1223 msg = " positional argument%s (and %d keyword-only argument%s)"
1224 kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
1225 "s" if kwonly_given != 1 else ""))
1226 raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
1227 (f_name, sig, "s" if plural else "", given, kwonly_sig,
1228 "was" if given == 1 and not kwonly_given else "were"))
1229
Benjamin Peterson3e6ab172014-01-02 12:24:08 -06001230def getcallargs(*func_and_positional, **named):
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001231 """Get the mapping of arguments to values.
1232
1233 A dict is returned, with keys the function argument names (including the
1234 names of the * and ** arguments, if any), and values the respective bound
1235 values from 'positional' and 'named'."""
Benjamin Peterson3e6ab172014-01-02 12:24:08 -06001236 func = func_and_positional[0]
1237 positional = func_and_positional[1:]
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001238 spec = getfullargspec(func)
1239 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
1240 f_name = func.__name__
1241 arg2value = {}
1242
Benjamin Petersonb204a422011-06-05 22:04:07 -05001243
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001244 if ismethod(func) and func.__self__ is not None:
1245 # implicit 'self' (or 'cls' for classmethods) argument
1246 positional = (func.__self__,) + positional
1247 num_pos = len(positional)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001248 num_args = len(args)
1249 num_defaults = len(defaults) if defaults else 0
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001250
Benjamin Petersonb204a422011-06-05 22:04:07 -05001251 n = min(num_pos, num_args)
1252 for i in range(n):
1253 arg2value[args[i]] = positional[i]
1254 if varargs:
1255 arg2value[varargs] = tuple(positional[n:])
1256 possible_kwargs = set(args + kwonlyargs)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001257 if varkw:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001258 arg2value[varkw] = {}
1259 for kw, value in named.items():
1260 if kw not in possible_kwargs:
1261 if not varkw:
1262 raise TypeError("%s() got an unexpected keyword argument %r" %
1263 (f_name, kw))
1264 arg2value[varkw][kw] = value
1265 continue
1266 if kw in arg2value:
1267 raise TypeError("%s() got multiple values for argument %r" %
1268 (f_name, kw))
1269 arg2value[kw] = value
1270 if num_pos > num_args and not varargs:
Benjamin Petersone109c702011-06-24 09:37:26 -05001271 _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
1272 num_pos, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001273 if num_pos < num_args:
Benjamin Petersone109c702011-06-24 09:37:26 -05001274 req = args[:num_args - num_defaults]
1275 for arg in req:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001276 if arg not in arg2value:
Benjamin Petersone109c702011-06-24 09:37:26 -05001277 _missing_arguments(f_name, req, True, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001278 for i, arg in enumerate(args[num_args - num_defaults:]):
1279 if arg not in arg2value:
1280 arg2value[arg] = defaults[i]
Benjamin Petersone109c702011-06-24 09:37:26 -05001281 missing = 0
Benjamin Petersonb204a422011-06-05 22:04:07 -05001282 for kwarg in kwonlyargs:
1283 if kwarg not in arg2value:
Yury Selivanov875df202014-03-27 18:23:03 -04001284 if kwonlydefaults and kwarg in kwonlydefaults:
Benjamin Petersone109c702011-06-24 09:37:26 -05001285 arg2value[kwarg] = kwonlydefaults[kwarg]
1286 else:
1287 missing += 1
1288 if missing:
1289 _missing_arguments(f_name, kwonlyargs, False, arg2value)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001290 return arg2value
1291
Nick Coghlan2f92e542012-06-23 19:39:55 +10001292ClosureVars = namedtuple('ClosureVars', 'nonlocals globals builtins unbound')
1293
1294def getclosurevars(func):
1295 """
1296 Get the mapping of free variables to their current values.
1297
Meador Inge8fda3592012-07-19 21:33:21 -05001298 Returns a named tuple of dicts mapping the current nonlocal, global
Nick Coghlan2f92e542012-06-23 19:39:55 +10001299 and builtin references as seen by the body of the function. A final
1300 set of unbound names that could not be resolved is also provided.
1301 """
1302
1303 if ismethod(func):
1304 func = func.__func__
1305
1306 if not isfunction(func):
1307 raise TypeError("'{!r}' is not a Python function".format(func))
1308
1309 code = func.__code__
1310 # Nonlocal references are named in co_freevars and resolved
1311 # by looking them up in __closure__ by positional index
1312 if func.__closure__ is None:
1313 nonlocal_vars = {}
1314 else:
1315 nonlocal_vars = {
1316 var : cell.cell_contents
1317 for var, cell in zip(code.co_freevars, func.__closure__)
1318 }
1319
1320 # Global and builtin references are named in co_names and resolved
1321 # by looking them up in __globals__ or __builtins__
1322 global_ns = func.__globals__
1323 builtin_ns = global_ns.get("__builtins__", builtins.__dict__)
1324 if ismodule(builtin_ns):
1325 builtin_ns = builtin_ns.__dict__
1326 global_vars = {}
1327 builtin_vars = {}
1328 unbound_names = set()
1329 for name in code.co_names:
1330 if name in ("None", "True", "False"):
1331 # Because these used to be builtins instead of keywords, they
1332 # may still show up as name references. We ignore them.
1333 continue
1334 try:
1335 global_vars[name] = global_ns[name]
1336 except KeyError:
1337 try:
1338 builtin_vars[name] = builtin_ns[name]
1339 except KeyError:
1340 unbound_names.add(name)
1341
1342 return ClosureVars(nonlocal_vars, global_vars,
1343 builtin_vars, unbound_names)
1344
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001345# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +00001346
1347Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
1348
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001349def getframeinfo(frame, context=1):
1350 """Get information about a frame or traceback object.
1351
1352 A tuple of five things is returned: the filename, the line number of
1353 the current line, the function name, a list of lines of context from
1354 the source code, and the index of the current line within that list.
1355 The optional second argument specifies the number of lines of context
1356 to return, which are centered around the current line."""
1357 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001358 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001359 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001360 else:
1361 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001362 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001363 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001364
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001365 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001366 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001367 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001368 try:
1369 lines, lnum = findsource(frame)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001370 except OSError:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001371 lines = index = None
1372 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001373 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001374 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001375 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001376 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001377 else:
1378 lines = index = None
1379
Christian Heimes25bb7832008-01-11 16:17:00 +00001380 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001381
1382def getlineno(frame):
1383 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001384 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1385 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001386
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001387FrameInfo = namedtuple('FrameInfo', ('frame',) + Traceback._fields)
1388
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001389def getouterframes(frame, context=1):
1390 """Get a list of records for a frame and all higher (calling) frames.
1391
1392 Each record contains a frame object, filename, line number, function
1393 name, a list of lines of context, and index within the context."""
1394 framelist = []
1395 while frame:
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001396 frameinfo = (frame,) + getframeinfo(frame, context)
1397 framelist.append(FrameInfo(*frameinfo))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001398 frame = frame.f_back
1399 return framelist
1400
1401def getinnerframes(tb, context=1):
1402 """Get a list of records for a traceback's frame and all lower frames.
1403
1404 Each record contains a frame object, filename, line number, function
1405 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001406 framelist = []
1407 while tb:
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001408 frameinfo = (tb.tb_frame,) + getframeinfo(tb, context)
1409 framelist.append(FrameInfo(*frameinfo))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001410 tb = tb.tb_next
1411 return framelist
1412
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001413def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001414 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001415 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001416
1417def stack(context=1):
1418 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001419 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001420
1421def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001422 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001423 return getinnerframes(sys.exc_info()[2], context)
Michael Foord95fc51d2010-11-20 15:07:30 +00001424
1425
1426# ------------------------------------------------ static version of getattr
1427
1428_sentinel = object()
1429
Michael Foorde5162652010-11-20 16:40:44 +00001430def _static_getmro(klass):
1431 return type.__dict__['__mro__'].__get__(klass)
1432
Michael Foord95fc51d2010-11-20 15:07:30 +00001433def _check_instance(obj, attr):
1434 instance_dict = {}
1435 try:
1436 instance_dict = object.__getattribute__(obj, "__dict__")
1437 except AttributeError:
1438 pass
Michael Foorddcebe0f2011-03-15 19:20:44 -04001439 return dict.get(instance_dict, attr, _sentinel)
Michael Foord95fc51d2010-11-20 15:07:30 +00001440
1441
1442def _check_class(klass, attr):
Michael Foorde5162652010-11-20 16:40:44 +00001443 for entry in _static_getmro(klass):
Michael Foorda51623b2011-12-18 22:01:40 +00001444 if _shadowed_dict(type(entry)) is _sentinel:
Michael Foorddcebe0f2011-03-15 19:20:44 -04001445 try:
1446 return entry.__dict__[attr]
1447 except KeyError:
1448 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001449 return _sentinel
1450
Michael Foord35184ed2010-11-20 16:58:30 +00001451def _is_type(obj):
1452 try:
1453 _static_getmro(obj)
1454 except TypeError:
1455 return False
1456 return True
1457
Michael Foorddcebe0f2011-03-15 19:20:44 -04001458def _shadowed_dict(klass):
1459 dict_attr = type.__dict__["__dict__"]
1460 for entry in _static_getmro(klass):
1461 try:
1462 class_dict = dict_attr.__get__(entry)["__dict__"]
1463 except KeyError:
1464 pass
1465 else:
1466 if not (type(class_dict) is types.GetSetDescriptorType and
1467 class_dict.__name__ == "__dict__" and
1468 class_dict.__objclass__ is entry):
Michael Foorda51623b2011-12-18 22:01:40 +00001469 return class_dict
1470 return _sentinel
Michael Foord95fc51d2010-11-20 15:07:30 +00001471
1472def getattr_static(obj, attr, default=_sentinel):
1473 """Retrieve attributes without triggering dynamic lookup via the
1474 descriptor protocol, __getattr__ or __getattribute__.
1475
1476 Note: this function may not be able to retrieve all attributes
1477 that getattr can fetch (like dynamically created attributes)
1478 and may find attributes that getattr can't (like descriptors
1479 that raise AttributeError). It can also return descriptor objects
1480 instead of instance members in some cases. See the
1481 documentation for details.
1482 """
1483 instance_result = _sentinel
Michael Foord35184ed2010-11-20 16:58:30 +00001484 if not _is_type(obj):
Michael Foordcc7ebb82010-11-20 16:20:16 +00001485 klass = type(obj)
Michael Foorda51623b2011-12-18 22:01:40 +00001486 dict_attr = _shadowed_dict(klass)
1487 if (dict_attr is _sentinel or
1488 type(dict_attr) is types.MemberDescriptorType):
Michael Foorddcebe0f2011-03-15 19:20:44 -04001489 instance_result = _check_instance(obj, attr)
Michael Foord95fc51d2010-11-20 15:07:30 +00001490 else:
1491 klass = obj
1492
1493 klass_result = _check_class(klass, attr)
1494
1495 if instance_result is not _sentinel and klass_result is not _sentinel:
1496 if (_check_class(type(klass_result), '__get__') is not _sentinel and
1497 _check_class(type(klass_result), '__set__') is not _sentinel):
1498 return klass_result
1499
1500 if instance_result is not _sentinel:
1501 return instance_result
1502 if klass_result is not _sentinel:
1503 return klass_result
1504
1505 if obj is klass:
1506 # for types we check the metaclass too
Michael Foorde5162652010-11-20 16:40:44 +00001507 for entry in _static_getmro(type(klass)):
Michael Foord3ba95f82011-12-22 01:13:37 +00001508 if _shadowed_dict(type(entry)) is _sentinel:
1509 try:
1510 return entry.__dict__[attr]
1511 except KeyError:
1512 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001513 if default is not _sentinel:
1514 return default
1515 raise AttributeError(attr)
Nick Coghlane0f04652010-11-21 03:44:04 +00001516
1517
Nick Coghlan04e2e3f2012-06-23 19:52:05 +10001518# ------------------------------------------------ generator introspection
1519
Nick Coghlan7921b9f2010-11-30 06:36:04 +00001520GEN_CREATED = 'GEN_CREATED'
1521GEN_RUNNING = 'GEN_RUNNING'
1522GEN_SUSPENDED = 'GEN_SUSPENDED'
1523GEN_CLOSED = 'GEN_CLOSED'
Nick Coghlane0f04652010-11-21 03:44:04 +00001524
1525def getgeneratorstate(generator):
1526 """Get current state of a generator-iterator.
1527
1528 Possible states are:
1529 GEN_CREATED: Waiting to start execution.
1530 GEN_RUNNING: Currently being executed by the interpreter.
1531 GEN_SUSPENDED: Currently suspended at a yield expression.
1532 GEN_CLOSED: Execution has completed.
1533 """
1534 if generator.gi_running:
1535 return GEN_RUNNING
1536 if generator.gi_frame is None:
1537 return GEN_CLOSED
1538 if generator.gi_frame.f_lasti == -1:
1539 return GEN_CREATED
1540 return GEN_SUSPENDED
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001541
1542
Nick Coghlan04e2e3f2012-06-23 19:52:05 +10001543def getgeneratorlocals(generator):
1544 """
1545 Get the mapping of generator local variables to their current values.
1546
1547 A dict is returned, with the keys the local variable names and values the
1548 bound values."""
1549
1550 if not isgenerator(generator):
1551 raise TypeError("'{!r}' is not a Python generator".format(generator))
1552
1553 frame = getattr(generator, "gi_frame", None)
1554 if frame is not None:
1555 return generator.gi_frame.f_locals
1556 else:
1557 return {}
1558
Yury Selivanov5376ba92015-06-22 12:19:30 -04001559
1560# ------------------------------------------------ coroutine introspection
1561
1562CORO_CREATED = 'CORO_CREATED'
1563CORO_RUNNING = 'CORO_RUNNING'
1564CORO_SUSPENDED = 'CORO_SUSPENDED'
1565CORO_CLOSED = 'CORO_CLOSED'
1566
1567def getcoroutinestate(coroutine):
1568 """Get current state of a coroutine object.
1569
1570 Possible states are:
1571 CORO_CREATED: Waiting to start execution.
1572 CORO_RUNNING: Currently being executed by the interpreter.
1573 CORO_SUSPENDED: Currently suspended at an await expression.
1574 CORO_CLOSED: Execution has completed.
1575 """
1576 if coroutine.cr_running:
1577 return CORO_RUNNING
1578 if coroutine.cr_frame is None:
1579 return CORO_CLOSED
1580 if coroutine.cr_frame.f_lasti == -1:
1581 return CORO_CREATED
1582 return CORO_SUSPENDED
1583
1584
1585def getcoroutinelocals(coroutine):
1586 """
1587 Get the mapping of coroutine local variables to their current values.
1588
1589 A dict is returned, with the keys the local variable names and values the
1590 bound values."""
1591 frame = getattr(coroutine, "cr_frame", None)
1592 if frame is not None:
1593 return frame.f_locals
1594 else:
1595 return {}
1596
1597
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001598###############################################################################
1599### Function Signature Object (PEP 362)
1600###############################################################################
1601
1602
1603_WrapperDescriptor = type(type.__call__)
1604_MethodWrapper = type(all.__call__)
Larry Hastings5c661892014-01-24 06:17:25 -08001605_ClassMethodWrapper = type(int.__dict__['from_bytes'])
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001606
1607_NonUserDefinedCallables = (_WrapperDescriptor,
1608 _MethodWrapper,
Larry Hastings5c661892014-01-24 06:17:25 -08001609 _ClassMethodWrapper,
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001610 types.BuiltinFunctionType)
1611
1612
Yury Selivanov421f0c72014-01-29 12:05:40 -05001613def _signature_get_user_defined_method(cls, method_name):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001614 """Private helper. Checks if ``cls`` has an attribute
1615 named ``method_name`` and returns it only if it is a
1616 pure python function.
1617 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001618 try:
1619 meth = getattr(cls, method_name)
1620 except AttributeError:
1621 return
1622 else:
1623 if not isinstance(meth, _NonUserDefinedCallables):
1624 # Once '__signature__' will be added to 'C'-level
1625 # callables, this check won't be necessary
1626 return meth
1627
1628
Yury Selivanov62560fb2014-01-28 12:26:24 -05001629def _signature_get_partial(wrapped_sig, partial, extra_args=()):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001630 """Private helper to calculate how 'wrapped_sig' signature will
1631 look like after applying a 'functools.partial' object (or alike)
1632 on it.
1633 """
Yury Selivanov62560fb2014-01-28 12:26:24 -05001634
Yury Selivanov3f73ca22014-04-08 11:30:45 -04001635 old_params = wrapped_sig.parameters
1636 new_params = OrderedDict(old_params.items())
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001637
1638 partial_args = partial.args or ()
1639 partial_keywords = partial.keywords or {}
1640
1641 if extra_args:
1642 partial_args = extra_args + partial_args
1643
1644 try:
1645 ba = wrapped_sig.bind_partial(*partial_args, **partial_keywords)
1646 except TypeError as ex:
1647 msg = 'partial object {!r} has incorrect arguments'.format(partial)
1648 raise ValueError(msg) from ex
1649
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001650
Yury Selivanov3f73ca22014-04-08 11:30:45 -04001651 transform_to_kwonly = False
1652 for param_name, param in old_params.items():
1653 try:
1654 arg_value = ba.arguments[param_name]
1655 except KeyError:
1656 pass
1657 else:
1658 if param.kind is _POSITIONAL_ONLY:
1659 # If positional-only parameter is bound by partial,
1660 # it effectively disappears from the signature
1661 new_params.pop(param_name)
1662 continue
1663
1664 if param.kind is _POSITIONAL_OR_KEYWORD:
1665 if param_name in partial_keywords:
1666 # This means that this parameter, and all parameters
1667 # after it should be keyword-only (and var-positional
1668 # should be removed). Here's why. Consider the following
1669 # function:
1670 # foo(a, b, *args, c):
1671 # pass
1672 #
1673 # "partial(foo, a='spam')" will have the following
1674 # signature: "(*, a='spam', b, c)". Because attempting
1675 # to call that partial with "(10, 20)" arguments will
1676 # raise a TypeError, saying that "a" argument received
1677 # multiple values.
1678 transform_to_kwonly = True
1679 # Set the new default value
1680 new_params[param_name] = param.replace(default=arg_value)
1681 else:
1682 # was passed as a positional argument
1683 new_params.pop(param.name)
1684 continue
1685
1686 if param.kind is _KEYWORD_ONLY:
1687 # Set the new default value
1688 new_params[param_name] = param.replace(default=arg_value)
1689
1690 if transform_to_kwonly:
1691 assert param.kind is not _POSITIONAL_ONLY
1692
1693 if param.kind is _POSITIONAL_OR_KEYWORD:
1694 new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY)
1695 new_params[param_name] = new_param
1696 new_params.move_to_end(param_name)
1697 elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD):
1698 new_params.move_to_end(param_name)
1699 elif param.kind is _VAR_POSITIONAL:
1700 new_params.pop(param.name)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001701
1702 return wrapped_sig.replace(parameters=new_params.values())
1703
1704
Yury Selivanov62560fb2014-01-28 12:26:24 -05001705def _signature_bound_method(sig):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001706 """Private helper to transform signatures for unbound
1707 functions to bound methods.
1708 """
Yury Selivanov62560fb2014-01-28 12:26:24 -05001709
1710 params = tuple(sig.parameters.values())
1711
1712 if not params or params[0].kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
1713 raise ValueError('invalid method signature')
1714
1715 kind = params[0].kind
1716 if kind in (_POSITIONAL_OR_KEYWORD, _POSITIONAL_ONLY):
1717 # Drop first parameter:
1718 # '(p1, p2[, ...])' -> '(p2[, ...])'
1719 params = params[1:]
1720 else:
1721 if kind is not _VAR_POSITIONAL:
1722 # Unless we add a new parameter type we never
1723 # get here
1724 raise ValueError('invalid argument type')
1725 # It's a var-positional parameter.
1726 # Do nothing. '(*args[, ...])' -> '(*args[, ...])'
1727
1728 return sig.replace(parameters=params)
1729
1730
Yury Selivanovb77511d2014-01-29 10:46:14 -05001731def _signature_is_builtin(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001732 """Private helper to test if `obj` is a callable that might
1733 support Argument Clinic's __text_signature__ protocol.
1734 """
Yury Selivanov1d241832014-02-02 12:51:20 -05001735 return (isbuiltin(obj) or
Yury Selivanovb77511d2014-01-29 10:46:14 -05001736 ismethoddescriptor(obj) or
Yury Selivanov1d241832014-02-02 12:51:20 -05001737 isinstance(obj, _NonUserDefinedCallables) or
Yury Selivanovb77511d2014-01-29 10:46:14 -05001738 # Can't test 'isinstance(type)' here, as it would
1739 # also be True for regular python classes
1740 obj in (type, object))
1741
1742
Yury Selivanov63da7c72014-01-31 14:48:37 -05001743def _signature_is_functionlike(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001744 """Private helper to test if `obj` is a duck type of FunctionType.
1745 A good example of such objects are functions compiled with
1746 Cython, which have all attributes that a pure Python function
1747 would have, but have their code statically compiled.
1748 """
Yury Selivanov63da7c72014-01-31 14:48:37 -05001749
1750 if not callable(obj) or isclass(obj):
1751 # All function-like objects are obviously callables,
1752 # and not classes.
1753 return False
1754
1755 name = getattr(obj, '__name__', None)
1756 code = getattr(obj, '__code__', None)
1757 defaults = getattr(obj, '__defaults__', _void) # Important to use _void ...
1758 kwdefaults = getattr(obj, '__kwdefaults__', _void) # ... and not None here
1759 annotations = getattr(obj, '__annotations__', None)
1760
1761 return (isinstance(code, types.CodeType) and
1762 isinstance(name, str) and
1763 (defaults is None or isinstance(defaults, tuple)) and
1764 (kwdefaults is None or isinstance(kwdefaults, dict)) and
1765 isinstance(annotations, dict))
1766
1767
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001768def _signature_get_bound_param(spec):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001769 """ Private helper to get first parameter name from a
1770 __text_signature__ of a builtin method, which should
1771 be in the following format: '($param1, ...)'.
1772 Assumptions are that the first argument won't have
1773 a default value or an annotation.
1774 """
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001775
1776 assert spec.startswith('($')
1777
1778 pos = spec.find(',')
1779 if pos == -1:
1780 pos = spec.find(')')
1781
1782 cpos = spec.find(':')
1783 assert cpos == -1 or cpos > pos
1784
1785 cpos = spec.find('=')
1786 assert cpos == -1 or cpos > pos
1787
1788 return spec[2:pos]
1789
1790
Larry Hastings2623c8c2014-02-08 22:15:29 -08001791def _signature_strip_non_python_syntax(signature):
1792 """
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001793 Private helper function. Takes a signature in Argument Clinic's
1794 extended signature format.
1795
Larry Hastings2623c8c2014-02-08 22:15:29 -08001796 Returns a tuple of three things:
1797 * that signature re-rendered in standard Python syntax,
1798 * the index of the "self" parameter (generally 0), or None if
1799 the function does not have a "self" parameter, and
1800 * the index of the last "positional only" parameter,
1801 or None if the signature has no positional-only parameters.
1802 """
1803
1804 if not signature:
1805 return signature, None, None
1806
1807 self_parameter = None
1808 last_positional_only = None
1809
1810 lines = [l.encode('ascii') for l in signature.split('\n')]
1811 generator = iter(lines).__next__
1812 token_stream = tokenize.tokenize(generator)
1813
1814 delayed_comma = False
1815 skip_next_comma = False
1816 text = []
1817 add = text.append
1818
1819 current_parameter = 0
1820 OP = token.OP
1821 ERRORTOKEN = token.ERRORTOKEN
1822
1823 # token stream always starts with ENCODING token, skip it
1824 t = next(token_stream)
1825 assert t.type == tokenize.ENCODING
1826
1827 for t in token_stream:
1828 type, string = t.type, t.string
1829
1830 if type == OP:
1831 if string == ',':
1832 if skip_next_comma:
1833 skip_next_comma = False
1834 else:
1835 assert not delayed_comma
1836 delayed_comma = True
1837 current_parameter += 1
1838 continue
1839
1840 if string == '/':
1841 assert not skip_next_comma
1842 assert last_positional_only is None
1843 skip_next_comma = True
1844 last_positional_only = current_parameter - 1
1845 continue
1846
1847 if (type == ERRORTOKEN) and (string == '$'):
1848 assert self_parameter is None
1849 self_parameter = current_parameter
1850 continue
1851
1852 if delayed_comma:
1853 delayed_comma = False
1854 if not ((type == OP) and (string == ')')):
1855 add(', ')
1856 add(string)
1857 if (string == ','):
1858 add(' ')
1859 clean_signature = ''.join(text)
1860 return clean_signature, self_parameter, last_positional_only
1861
1862
Yury Selivanov57d240e2014-02-19 16:27:23 -05001863def _signature_fromstr(cls, obj, s, skip_bound_arg=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001864 """Private helper to parse content of '__text_signature__'
1865 and return a Signature based on it.
1866 """
1867
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001868 Parameter = cls._parameter_cls
1869
Larry Hastings2623c8c2014-02-08 22:15:29 -08001870 clean_signature, self_parameter, last_positional_only = \
1871 _signature_strip_non_python_syntax(s)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001872
Larry Hastings2623c8c2014-02-08 22:15:29 -08001873 program = "def foo" + clean_signature + ": pass"
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001874
1875 try:
Larry Hastings2623c8c2014-02-08 22:15:29 -08001876 module = ast.parse(program)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001877 except SyntaxError:
1878 module = None
1879
1880 if not isinstance(module, ast.Module):
1881 raise ValueError("{!r} builtin has invalid signature".format(obj))
1882
1883 f = module.body[0]
1884
1885 parameters = []
1886 empty = Parameter.empty
1887 invalid = object()
1888
1889 module = None
1890 module_dict = {}
1891 module_name = getattr(obj, '__module__', None)
1892 if module_name:
1893 module = sys.modules.get(module_name, None)
1894 if module:
1895 module_dict = module.__dict__
1896 sys_module_dict = sys.modules
1897
1898 def parse_name(node):
1899 assert isinstance(node, ast.arg)
1900 if node.annotation != None:
1901 raise ValueError("Annotations are not currently supported")
1902 return node.arg
1903
1904 def wrap_value(s):
1905 try:
1906 value = eval(s, module_dict)
1907 except NameError:
1908 try:
1909 value = eval(s, sys_module_dict)
1910 except NameError:
1911 raise RuntimeError()
1912
1913 if isinstance(value, str):
1914 return ast.Str(value)
1915 if isinstance(value, (int, float)):
1916 return ast.Num(value)
1917 if isinstance(value, bytes):
1918 return ast.Bytes(value)
1919 if value in (True, False, None):
1920 return ast.NameConstant(value)
1921 raise RuntimeError()
1922
1923 class RewriteSymbolics(ast.NodeTransformer):
1924 def visit_Attribute(self, node):
1925 a = []
1926 n = node
1927 while isinstance(n, ast.Attribute):
1928 a.append(n.attr)
1929 n = n.value
1930 if not isinstance(n, ast.Name):
1931 raise RuntimeError()
1932 a.append(n.id)
1933 value = ".".join(reversed(a))
1934 return wrap_value(value)
1935
1936 def visit_Name(self, node):
1937 if not isinstance(node.ctx, ast.Load):
1938 raise ValueError()
1939 return wrap_value(node.id)
1940
1941 def p(name_node, default_node, default=empty):
1942 name = parse_name(name_node)
1943 if name is invalid:
1944 return None
1945 if default_node and default_node is not _empty:
1946 try:
1947 default_node = RewriteSymbolics().visit(default_node)
1948 o = ast.literal_eval(default_node)
1949 except ValueError:
1950 o = invalid
1951 if o is invalid:
1952 return None
1953 default = o if o is not invalid else default
1954 parameters.append(Parameter(name, kind, default=default, annotation=empty))
1955
1956 # non-keyword-only parameters
1957 args = reversed(f.args.args)
1958 defaults = reversed(f.args.defaults)
1959 iter = itertools.zip_longest(args, defaults, fillvalue=None)
Larry Hastings2623c8c2014-02-08 22:15:29 -08001960 if last_positional_only is not None:
1961 kind = Parameter.POSITIONAL_ONLY
1962 else:
1963 kind = Parameter.POSITIONAL_OR_KEYWORD
1964 for i, (name, default) in enumerate(reversed(list(iter))):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001965 p(name, default)
Larry Hastings2623c8c2014-02-08 22:15:29 -08001966 if i == last_positional_only:
1967 kind = Parameter.POSITIONAL_OR_KEYWORD
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001968
1969 # *args
1970 if f.args.vararg:
1971 kind = Parameter.VAR_POSITIONAL
1972 p(f.args.vararg, empty)
1973
1974 # keyword-only arguments
1975 kind = Parameter.KEYWORD_ONLY
1976 for name, default in zip(f.args.kwonlyargs, f.args.kw_defaults):
1977 p(name, default)
1978
1979 # **kwargs
1980 if f.args.kwarg:
1981 kind = Parameter.VAR_KEYWORD
1982 p(f.args.kwarg, empty)
1983
Larry Hastings2623c8c2014-02-08 22:15:29 -08001984 if self_parameter is not None:
Yury Selivanov8c185ee2014-02-21 01:32:42 -05001985 # Possibly strip the bound argument:
1986 # - We *always* strip first bound argument if
1987 # it is a module.
1988 # - We don't strip first bound argument if
1989 # skip_bound_arg is False.
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001990 assert parameters
Yury Selivanov8c185ee2014-02-21 01:32:42 -05001991 _self = getattr(obj, '__self__', None)
1992 self_isbound = _self is not None
1993 self_ismodule = ismodule(_self)
1994 if self_isbound and (self_ismodule or skip_bound_arg):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001995 parameters.pop(0)
1996 else:
1997 # for builtins, self parameter is always positional-only!
1998 p = parameters[0].replace(kind=Parameter.POSITIONAL_ONLY)
1999 parameters[0] = p
2000
2001 return cls(parameters, return_annotation=cls.empty)
2002
2003
Yury Selivanov57d240e2014-02-19 16:27:23 -05002004def _signature_from_builtin(cls, func, skip_bound_arg=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002005 """Private helper function to get signature for
2006 builtin callables.
2007 """
2008
Yury Selivanov57d240e2014-02-19 16:27:23 -05002009 if not _signature_is_builtin(func):
2010 raise TypeError("{!r} is not a Python builtin "
2011 "function".format(func))
2012
2013 s = getattr(func, "__text_signature__", None)
2014 if not s:
2015 raise ValueError("no signature found for builtin {!r}".format(func))
2016
2017 return _signature_fromstr(cls, func, s, skip_bound_arg)
2018
2019
Yury Selivanovcf45f022015-05-20 14:38:50 -04002020def _signature_from_function(cls, func):
2021 """Private helper: constructs Signature for the given python function."""
2022
2023 is_duck_function = False
2024 if not isfunction(func):
2025 if _signature_is_functionlike(func):
2026 is_duck_function = True
2027 else:
2028 # If it's not a pure Python function, and not a duck type
2029 # of pure function:
2030 raise TypeError('{!r} is not a Python function'.format(func))
2031
2032 Parameter = cls._parameter_cls
2033
2034 # Parameter information.
2035 func_code = func.__code__
2036 pos_count = func_code.co_argcount
2037 arg_names = func_code.co_varnames
2038 positional = tuple(arg_names[:pos_count])
2039 keyword_only_count = func_code.co_kwonlyargcount
2040 keyword_only = arg_names[pos_count:(pos_count + keyword_only_count)]
2041 annotations = func.__annotations__
2042 defaults = func.__defaults__
2043 kwdefaults = func.__kwdefaults__
2044
2045 if defaults:
2046 pos_default_count = len(defaults)
2047 else:
2048 pos_default_count = 0
2049
2050 parameters = []
2051
2052 # Non-keyword-only parameters w/o defaults.
2053 non_default_count = pos_count - pos_default_count
2054 for name in positional[:non_default_count]:
2055 annotation = annotations.get(name, _empty)
2056 parameters.append(Parameter(name, annotation=annotation,
2057 kind=_POSITIONAL_OR_KEYWORD))
2058
2059 # ... w/ defaults.
2060 for offset, name in enumerate(positional[non_default_count:]):
2061 annotation = annotations.get(name, _empty)
2062 parameters.append(Parameter(name, annotation=annotation,
2063 kind=_POSITIONAL_OR_KEYWORD,
2064 default=defaults[offset]))
2065
2066 # *args
2067 if func_code.co_flags & CO_VARARGS:
2068 name = arg_names[pos_count + keyword_only_count]
2069 annotation = annotations.get(name, _empty)
2070 parameters.append(Parameter(name, annotation=annotation,
2071 kind=_VAR_POSITIONAL))
2072
2073 # Keyword-only parameters.
2074 for name in keyword_only:
2075 default = _empty
2076 if kwdefaults is not None:
2077 default = kwdefaults.get(name, _empty)
2078
2079 annotation = annotations.get(name, _empty)
2080 parameters.append(Parameter(name, annotation=annotation,
2081 kind=_KEYWORD_ONLY,
2082 default=default))
2083 # **kwargs
2084 if func_code.co_flags & CO_VARKEYWORDS:
2085 index = pos_count + keyword_only_count
2086 if func_code.co_flags & CO_VARARGS:
2087 index += 1
2088
2089 name = arg_names[index]
2090 annotation = annotations.get(name, _empty)
2091 parameters.append(Parameter(name, annotation=annotation,
2092 kind=_VAR_KEYWORD))
2093
2094 # Is 'func' is a pure Python function - don't validate the
2095 # parameters list (for correct order and defaults), it should be OK.
2096 return cls(parameters,
2097 return_annotation=annotations.get('return', _empty),
2098 __validate_parameters__=is_duck_function)
2099
2100
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002101def _signature_from_callable(obj, *,
2102 follow_wrapper_chains=True,
2103 skip_bound_arg=True,
2104 sigcls):
2105
2106 """Private helper function to get signature for arbitrary
2107 callable objects.
2108 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002109
2110 if not callable(obj):
2111 raise TypeError('{!r} is not a callable object'.format(obj))
2112
2113 if isinstance(obj, types.MethodType):
2114 # In this case we skip the first parameter of the underlying
2115 # function (usually `self` or `cls`).
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002116 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002117 obj.__func__,
2118 follow_wrapper_chains=follow_wrapper_chains,
2119 skip_bound_arg=skip_bound_arg,
2120 sigcls=sigcls)
2121
Yury Selivanov57d240e2014-02-19 16:27:23 -05002122 if skip_bound_arg:
2123 return _signature_bound_method(sig)
2124 else:
2125 return sig
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002126
Nick Coghlane8c45d62013-07-28 20:00:01 +10002127 # Was this function wrapped by a decorator?
Yury Selivanov57d240e2014-02-19 16:27:23 -05002128 if follow_wrapper_chains:
2129 obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")))
Yury Selivanov46c759d2015-05-27 21:56:53 -04002130 if isinstance(obj, types.MethodType):
2131 # If the unwrapped object is a *method*, we might want to
2132 # skip its first parameter (self).
2133 # See test_signature_wrapped_bound_method for details.
Yury Selivanov507cd3c2015-05-27 21:59:03 -04002134 return _signature_from_callable(
Yury Selivanov46c759d2015-05-27 21:56:53 -04002135 obj,
2136 follow_wrapper_chains=follow_wrapper_chains,
Yury Selivanov507cd3c2015-05-27 21:59:03 -04002137 skip_bound_arg=skip_bound_arg,
2138 sigcls=sigcls)
Nick Coghlane8c45d62013-07-28 20:00:01 +10002139
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002140 try:
2141 sig = obj.__signature__
2142 except AttributeError:
2143 pass
2144 else:
2145 if sig is not None:
Yury Selivanov42407ab2014-06-23 10:23:50 -07002146 if not isinstance(sig, Signature):
2147 raise TypeError(
2148 'unexpected object {!r} in __signature__ '
2149 'attribute'.format(sig))
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002150 return sig
2151
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002152 try:
2153 partialmethod = obj._partialmethod
2154 except AttributeError:
2155 pass
2156 else:
Yury Selivanov0486f812014-01-29 12:18:59 -05002157 if isinstance(partialmethod, functools.partialmethod):
2158 # Unbound partialmethod (see functools.partialmethod)
2159 # This means, that we need to calculate the signature
2160 # as if it's a regular partial object, but taking into
2161 # account that the first positional argument
2162 # (usually `self`, or `cls`) will not be passed
2163 # automatically (as for boundmethods)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002164
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002165 wrapped_sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002166 partialmethod.func,
2167 follow_wrapper_chains=follow_wrapper_chains,
2168 skip_bound_arg=skip_bound_arg,
2169 sigcls=sigcls)
2170
Yury Selivanov0486f812014-01-29 12:18:59 -05002171 sig = _signature_get_partial(wrapped_sig, partialmethod, (None,))
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002172
Yury Selivanov0486f812014-01-29 12:18:59 -05002173 first_wrapped_param = tuple(wrapped_sig.parameters.values())[0]
2174 new_params = (first_wrapped_param,) + tuple(sig.parameters.values())
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002175
Yury Selivanov0486f812014-01-29 12:18:59 -05002176 return sig.replace(parameters=new_params)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05002177
Yury Selivanov63da7c72014-01-31 14:48:37 -05002178 if isfunction(obj) or _signature_is_functionlike(obj):
2179 # If it's a pure Python function, or an object that is duck type
2180 # of a Python function (Cython functions, for instance), then:
Yury Selivanovcf45f022015-05-20 14:38:50 -04002181 return _signature_from_function(sigcls, obj)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002182
Yury Selivanova773de02014-02-21 18:30:53 -05002183 if _signature_is_builtin(obj):
Yury Selivanovda396452014-03-27 12:09:24 -04002184 return _signature_from_builtin(sigcls, obj,
Yury Selivanova773de02014-02-21 18:30:53 -05002185 skip_bound_arg=skip_bound_arg)
2186
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002187 if isinstance(obj, functools.partial):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002188 wrapped_sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002189 obj.func,
2190 follow_wrapper_chains=follow_wrapper_chains,
2191 skip_bound_arg=skip_bound_arg,
2192 sigcls=sigcls)
Yury Selivanov62560fb2014-01-28 12:26:24 -05002193 return _signature_get_partial(wrapped_sig, obj)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002194
2195 sig = None
2196 if isinstance(obj, type):
2197 # obj is a class or a metaclass
2198
2199 # First, let's see if it has an overloaded __call__ defined
2200 # in its metaclass
Yury Selivanov421f0c72014-01-29 12:05:40 -05002201 call = _signature_get_user_defined_method(type(obj), '__call__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002202 if call is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002203 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002204 call,
2205 follow_wrapper_chains=follow_wrapper_chains,
2206 skip_bound_arg=skip_bound_arg,
2207 sigcls=sigcls)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002208 else:
2209 # Now we check if the 'obj' class has a '__new__' method
Yury Selivanov421f0c72014-01-29 12:05:40 -05002210 new = _signature_get_user_defined_method(obj, '__new__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002211 if new is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002212 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002213 new,
2214 follow_wrapper_chains=follow_wrapper_chains,
2215 skip_bound_arg=skip_bound_arg,
2216 sigcls=sigcls)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002217 else:
2218 # Finally, we should have at least __init__ implemented
Yury Selivanov421f0c72014-01-29 12:05:40 -05002219 init = _signature_get_user_defined_method(obj, '__init__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002220 if init is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002221 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002222 init,
2223 follow_wrapper_chains=follow_wrapper_chains,
2224 skip_bound_arg=skip_bound_arg,
2225 sigcls=sigcls)
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002226
2227 if sig is None:
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002228 # At this point we know, that `obj` is a class, with no user-
2229 # defined '__init__', '__new__', or class-level '__call__'
2230
Larry Hastings2623c8c2014-02-08 22:15:29 -08002231 for base in obj.__mro__[:-1]:
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002232 # Since '__text_signature__' is implemented as a
2233 # descriptor that extracts text signature from the
2234 # class docstring, if 'obj' is derived from a builtin
2235 # class, its own '__text_signature__' may be 'None'.
Larry Hastings2623c8c2014-02-08 22:15:29 -08002236 # Therefore, we go through the MRO (except the last
2237 # class in there, which is 'object') to find the first
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002238 # class with non-empty text signature.
2239 try:
2240 text_sig = base.__text_signature__
2241 except AttributeError:
2242 pass
2243 else:
2244 if text_sig:
2245 # If 'obj' class has a __text_signature__ attribute:
2246 # return a signature based on it
Yury Selivanovda396452014-03-27 12:09:24 -04002247 return _signature_fromstr(sigcls, obj, text_sig)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002248
2249 # No '__text_signature__' was found for the 'obj' class.
2250 # Last option is to check if its '__init__' is
2251 # object.__init__ or type.__init__.
Larry Hastings2623c8c2014-02-08 22:15:29 -08002252 if type not in obj.__mro__:
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002253 # We have a class (not metaclass), but no user-defined
2254 # __init__ or __new__ for it
Yury Selivanovbf304fc2015-05-30 17:08:36 -04002255 if (obj.__init__ is object.__init__ and
2256 obj.__new__ is object.__new__):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002257 # Return a signature of 'object' builtin.
2258 return signature(object)
Yury Selivanovbf304fc2015-05-30 17:08:36 -04002259 else:
2260 raise ValueError(
2261 'no signature found for builtin type {!r}'.format(obj))
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002262
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002263 elif not isinstance(obj, _NonUserDefinedCallables):
2264 # An object with __call__
2265 # We also check that the 'obj' is not an instance of
2266 # _WrapperDescriptor or _MethodWrapper to avoid
2267 # infinite recursion (and even potential segfault)
Yury Selivanov421f0c72014-01-29 12:05:40 -05002268 call = _signature_get_user_defined_method(type(obj), '__call__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002269 if call is not None:
Larry Hastings2623c8c2014-02-08 22:15:29 -08002270 try:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002271 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002272 call,
2273 follow_wrapper_chains=follow_wrapper_chains,
2274 skip_bound_arg=skip_bound_arg,
2275 sigcls=sigcls)
Larry Hastings2623c8c2014-02-08 22:15:29 -08002276 except ValueError as ex:
2277 msg = 'no signature found for {!r}'.format(obj)
2278 raise ValueError(msg) from ex
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002279
2280 if sig is not None:
2281 # For classes and objects we skip the first parameter of their
2282 # __call__, __new__, or __init__ methods
Yury Selivanov57d240e2014-02-19 16:27:23 -05002283 if skip_bound_arg:
2284 return _signature_bound_method(sig)
2285 else:
2286 return sig
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002287
2288 if isinstance(obj, types.BuiltinFunctionType):
2289 # Raise a nicer error message for builtins
2290 msg = 'no signature found for builtin function {!r}'.format(obj)
2291 raise ValueError(msg)
2292
2293 raise ValueError('callable {!r} is not supported by signature'.format(obj))
2294
2295
2296class _void:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002297 """A private marker - used in Parameter & Signature."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002298
2299
2300class _empty:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002301 """Marker object for Signature.empty and Parameter.empty."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002302
2303
Yury Selivanov21e83a52014-03-27 11:23:13 -04002304class _ParameterKind(enum.IntEnum):
2305 POSITIONAL_ONLY = 0
2306 POSITIONAL_OR_KEYWORD = 1
2307 VAR_POSITIONAL = 2
2308 KEYWORD_ONLY = 3
2309 VAR_KEYWORD = 4
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002310
2311 def __str__(self):
Yury Selivanov21e83a52014-03-27 11:23:13 -04002312 return self._name_
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002313
2314
Yury Selivanov21e83a52014-03-27 11:23:13 -04002315_POSITIONAL_ONLY = _ParameterKind.POSITIONAL_ONLY
2316_POSITIONAL_OR_KEYWORD = _ParameterKind.POSITIONAL_OR_KEYWORD
2317_VAR_POSITIONAL = _ParameterKind.VAR_POSITIONAL
2318_KEYWORD_ONLY = _ParameterKind.KEYWORD_ONLY
2319_VAR_KEYWORD = _ParameterKind.VAR_KEYWORD
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002320
2321
2322class Parameter:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002323 """Represents a parameter in a function signature.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002324
2325 Has the following public attributes:
2326
2327 * name : str
2328 The name of the parameter as a string.
2329 * default : object
2330 The default value for the parameter if specified. If the
Yury Selivanov8757ead2014-01-28 16:39:25 -05002331 parameter has no default value, this attribute is set to
2332 `Parameter.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002333 * annotation
2334 The annotation for the parameter if specified. If the
Yury Selivanov8757ead2014-01-28 16:39:25 -05002335 parameter has no annotation, this attribute is set to
2336 `Parameter.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002337 * kind : str
2338 Describes how argument values are bound to the parameter.
2339 Possible values: `Parameter.POSITIONAL_ONLY`,
2340 `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`,
2341 `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002342 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002343
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002344 __slots__ = ('_name', '_kind', '_default', '_annotation')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002345
2346 POSITIONAL_ONLY = _POSITIONAL_ONLY
2347 POSITIONAL_OR_KEYWORD = _POSITIONAL_OR_KEYWORD
2348 VAR_POSITIONAL = _VAR_POSITIONAL
2349 KEYWORD_ONLY = _KEYWORD_ONLY
2350 VAR_KEYWORD = _VAR_KEYWORD
2351
2352 empty = _empty
2353
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002354 def __init__(self, name, kind, *, default=_empty, annotation=_empty):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002355
2356 if kind not in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD,
2357 _VAR_POSITIONAL, _KEYWORD_ONLY, _VAR_KEYWORD):
2358 raise ValueError("invalid value for 'Parameter.kind' attribute")
2359 self._kind = kind
2360
2361 if default is not _empty:
2362 if kind in (_VAR_POSITIONAL, _VAR_KEYWORD):
2363 msg = '{} parameters cannot have default values'.format(kind)
2364 raise ValueError(msg)
2365 self._default = default
2366 self._annotation = annotation
2367
Yury Selivanov2393dca2014-01-27 15:07:58 -05002368 if name is _empty:
2369 raise ValueError('name is a required attribute for Parameter')
2370
2371 if not isinstance(name, str):
2372 raise TypeError("name must be a str, not a {!r}".format(name))
2373
2374 if not name.isidentifier():
2375 raise ValueError('{!r} is not a valid parameter name'.format(name))
2376
2377 self._name = name
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002378
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002379 def __reduce__(self):
2380 return (type(self),
2381 (self._name, self._kind),
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002382 {'_default': self._default,
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002383 '_annotation': self._annotation})
2384
2385 def __setstate__(self, state):
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002386 self._default = state['_default']
2387 self._annotation = state['_annotation']
2388
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002389 @property
2390 def name(self):
2391 return self._name
2392
2393 @property
2394 def default(self):
2395 return self._default
2396
2397 @property
2398 def annotation(self):
2399 return self._annotation
2400
2401 @property
2402 def kind(self):
2403 return self._kind
2404
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002405 def replace(self, *, name=_void, kind=_void,
2406 annotation=_void, default=_void):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002407 """Creates a customized copy of the Parameter."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002408
2409 if name is _void:
2410 name = self._name
2411
2412 if kind is _void:
2413 kind = self._kind
2414
2415 if annotation is _void:
2416 annotation = self._annotation
2417
2418 if default is _void:
2419 default = self._default
2420
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002421 return type(self)(name, kind, default=default, annotation=annotation)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002422
2423 def __str__(self):
2424 kind = self.kind
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002425 formatted = self._name
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002426
2427 # Add annotation and default value
2428 if self._annotation is not _empty:
2429 formatted = '{}:{}'.format(formatted,
2430 formatannotation(self._annotation))
2431
2432 if self._default is not _empty:
2433 formatted = '{}={}'.format(formatted, repr(self._default))
2434
2435 if kind == _VAR_POSITIONAL:
2436 formatted = '*' + formatted
2437 elif kind == _VAR_KEYWORD:
2438 formatted = '**' + formatted
2439
2440 return formatted
2441
2442 def __repr__(self):
Yury Selivanovf229bc52015-05-15 12:53:56 -04002443 return '<{} "{}">'.format(self.__class__.__name__, self)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002444
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002445 def __hash__(self):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002446 return hash((self.name, self.kind, self.annotation, self.default))
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002447
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002448 def __eq__(self, other):
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002449 if self is other:
2450 return True
Serhiy Storchaka3018cc42015-07-18 23:19:05 +03002451 if not isinstance(other, Parameter):
2452 return NotImplemented
2453 return (self._name == other._name and
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002454 self._kind == other._kind and
2455 self._default == other._default and
2456 self._annotation == other._annotation)
2457
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002458
2459class BoundArguments:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002460 """Result of `Signature.bind` call. Holds the mapping of arguments
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002461 to the function's parameters.
2462
2463 Has the following public attributes:
2464
2465 * arguments : OrderedDict
2466 An ordered mutable mapping of parameters' names to arguments' values.
2467 Does not contain arguments' default values.
2468 * signature : Signature
2469 The Signature object that created this instance.
2470 * args : tuple
2471 Tuple of positional arguments values.
2472 * kwargs : dict
2473 Dict of keyword arguments values.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002474 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002475
Yury Selivanov6abe0322015-05-13 17:18:41 -04002476 __slots__ = ('arguments', '_signature', '__weakref__')
2477
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002478 def __init__(self, signature, arguments):
2479 self.arguments = arguments
2480 self._signature = signature
2481
2482 @property
2483 def signature(self):
2484 return self._signature
2485
2486 @property
2487 def args(self):
2488 args = []
2489 for param_name, param in self._signature.parameters.items():
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002490 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002491 break
2492
2493 try:
2494 arg = self.arguments[param_name]
2495 except KeyError:
2496 # We're done here. Other arguments
2497 # will be mapped in 'BoundArguments.kwargs'
2498 break
2499 else:
2500 if param.kind == _VAR_POSITIONAL:
2501 # *args
2502 args.extend(arg)
2503 else:
2504 # plain argument
2505 args.append(arg)
2506
2507 return tuple(args)
2508
2509 @property
2510 def kwargs(self):
2511 kwargs = {}
2512 kwargs_started = False
2513 for param_name, param in self._signature.parameters.items():
2514 if not kwargs_started:
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002515 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002516 kwargs_started = True
2517 else:
2518 if param_name not in self.arguments:
2519 kwargs_started = True
2520 continue
2521
2522 if not kwargs_started:
2523 continue
2524
2525 try:
2526 arg = self.arguments[param_name]
2527 except KeyError:
2528 pass
2529 else:
2530 if param.kind == _VAR_KEYWORD:
2531 # **kwargs
2532 kwargs.update(arg)
2533 else:
2534 # plain keyword argument
2535 kwargs[param_name] = arg
2536
2537 return kwargs
2538
Yury Selivanovb907a512015-05-16 13:45:09 -04002539 def apply_defaults(self):
2540 """Set default values for missing arguments.
2541
2542 For variable-positional arguments (*args) the default is an
2543 empty tuple.
2544
2545 For variable-keyword arguments (**kwargs) the default is an
2546 empty dict.
2547 """
2548 arguments = self.arguments
2549 if not arguments:
2550 return
2551 new_arguments = []
2552 for name, param in self._signature.parameters.items():
2553 try:
2554 new_arguments.append((name, arguments[name]))
2555 except KeyError:
2556 if param.default is not _empty:
2557 val = param.default
2558 elif param.kind is _VAR_POSITIONAL:
2559 val = ()
2560 elif param.kind is _VAR_KEYWORD:
2561 val = {}
2562 else:
2563 # This BoundArguments was likely produced by
2564 # Signature.bind_partial().
2565 continue
2566 new_arguments.append((name, val))
2567 self.arguments = OrderedDict(new_arguments)
2568
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002569 def __eq__(self, other):
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002570 if self is other:
2571 return True
Serhiy Storchaka3018cc42015-07-18 23:19:05 +03002572 if not isinstance(other, BoundArguments):
2573 return NotImplemented
2574 return (self.signature == other.signature and
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002575 self.arguments == other.arguments)
2576
Yury Selivanov6abe0322015-05-13 17:18:41 -04002577 def __setstate__(self, state):
2578 self._signature = state['_signature']
2579 self.arguments = state['arguments']
2580
2581 def __getstate__(self):
2582 return {'_signature': self._signature, 'arguments': self.arguments}
2583
Yury Selivanov3f6538f2015-05-14 18:47:17 -04002584 def __repr__(self):
2585 args = []
2586 for arg, value in self.arguments.items():
2587 args.append('{}={!r}'.format(arg, value))
Yury Selivanovf229bc52015-05-15 12:53:56 -04002588 return '<{} ({})>'.format(self.__class__.__name__, ', '.join(args))
Yury Selivanov3f6538f2015-05-14 18:47:17 -04002589
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002590
2591class Signature:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002592 """A Signature object represents the overall signature of a function.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002593 It stores a Parameter object for each parameter accepted by the
2594 function, as well as information specific to the function itself.
2595
2596 A Signature object has the following public attributes and methods:
2597
2598 * parameters : OrderedDict
2599 An ordered mapping of parameters' names to the corresponding
2600 Parameter objects (keyword-only arguments are in the same order
2601 as listed in `code.co_varnames`).
2602 * return_annotation : object
2603 The annotation for the return type of the function if specified.
2604 If the function has no annotation for its return type, this
Yury Selivanov8757ead2014-01-28 16:39:25 -05002605 attribute is set to `Signature.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002606 * bind(*args, **kwargs) -> BoundArguments
2607 Creates a mapping from positional and keyword arguments to
2608 parameters.
2609 * bind_partial(*args, **kwargs) -> BoundArguments
2610 Creates a partial mapping from positional and keyword arguments
2611 to parameters (simulating 'functools.partial' behavior.)
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002612 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002613
2614 __slots__ = ('_return_annotation', '_parameters')
2615
2616 _parameter_cls = Parameter
2617 _bound_arguments_cls = BoundArguments
2618
2619 empty = _empty
2620
2621 def __init__(self, parameters=None, *, return_annotation=_empty,
2622 __validate_parameters__=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002623 """Constructs Signature from the given list of Parameter
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002624 objects and 'return_annotation'. All arguments are optional.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002625 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002626
2627 if parameters is None:
2628 params = OrderedDict()
2629 else:
2630 if __validate_parameters__:
2631 params = OrderedDict()
2632 top_kind = _POSITIONAL_ONLY
Yury Selivanov07a9e452014-01-29 10:58:16 -05002633 kind_defaults = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002634
2635 for idx, param in enumerate(parameters):
2636 kind = param.kind
Yury Selivanov2393dca2014-01-27 15:07:58 -05002637 name = param.name
2638
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002639 if kind < top_kind:
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002640 msg = 'wrong parameter order: {!r} before {!r}'
Yury Selivanov2393dca2014-01-27 15:07:58 -05002641 msg = msg.format(top_kind, kind)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002642 raise ValueError(msg)
Yury Selivanov07a9e452014-01-29 10:58:16 -05002643 elif kind > top_kind:
2644 kind_defaults = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002645 top_kind = kind
2646
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002647 if kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD):
Yury Selivanov07a9e452014-01-29 10:58:16 -05002648 if param.default is _empty:
2649 if kind_defaults:
2650 # No default for this parameter, but the
2651 # previous parameter of the same kind had
2652 # a default
2653 msg = 'non-default argument follows default ' \
2654 'argument'
2655 raise ValueError(msg)
2656 else:
2657 # There is a default for this parameter.
2658 kind_defaults = True
2659
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002660 if name in params:
2661 msg = 'duplicate parameter name: {!r}'.format(name)
2662 raise ValueError(msg)
Yury Selivanov2393dca2014-01-27 15:07:58 -05002663
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002664 params[name] = param
2665 else:
2666 params = OrderedDict(((param.name, param)
2667 for param in parameters))
2668
2669 self._parameters = types.MappingProxyType(params)
2670 self._return_annotation = return_annotation
2671
2672 @classmethod
2673 def from_function(cls, func):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002674 """Constructs Signature for the given python function."""
Yury Selivanov57c74fc2015-05-20 23:07:02 -04002675
2676 warnings.warn("inspect.Signature.from_function() is deprecated, "
Berker Peksagb5601582015-05-21 23:40:54 +03002677 "use Signature.from_callable()",
2678 DeprecationWarning, stacklevel=2)
Yury Selivanovcf45f022015-05-20 14:38:50 -04002679 return _signature_from_function(cls, func)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002680
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002681 @classmethod
2682 def from_builtin(cls, func):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002683 """Constructs Signature for the given builtin function."""
Yury Selivanov57c74fc2015-05-20 23:07:02 -04002684
2685 warnings.warn("inspect.Signature.from_builtin() is deprecated, "
Berker Peksagb5601582015-05-21 23:40:54 +03002686 "use Signature.from_callable()",
2687 DeprecationWarning, stacklevel=2)
Yury Selivanov57d240e2014-02-19 16:27:23 -05002688 return _signature_from_builtin(cls, func)
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002689
Yury Selivanovda396452014-03-27 12:09:24 -04002690 @classmethod
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002691 def from_callable(cls, obj, *, follow_wrapped=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002692 """Constructs Signature for the given callable object."""
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002693 return _signature_from_callable(obj, sigcls=cls,
2694 follow_wrapper_chains=follow_wrapped)
Yury Selivanovda396452014-03-27 12:09:24 -04002695
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002696 @property
2697 def parameters(self):
2698 return self._parameters
2699
2700 @property
2701 def return_annotation(self):
2702 return self._return_annotation
2703
2704 def replace(self, *, parameters=_void, return_annotation=_void):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002705 """Creates a customized copy of the Signature.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002706 Pass 'parameters' and/or 'return_annotation' arguments
2707 to override them in the new copy.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002708 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002709
2710 if parameters is _void:
2711 parameters = self.parameters.values()
2712
2713 if return_annotation is _void:
2714 return_annotation = self._return_annotation
2715
2716 return type(self)(parameters,
2717 return_annotation=return_annotation)
2718
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002719 def _hash_basis(self):
2720 params = tuple(param for param in self.parameters.values()
2721 if param.kind != _KEYWORD_ONLY)
2722
2723 kwo_params = {param.name: param for param in self.parameters.values()
2724 if param.kind == _KEYWORD_ONLY}
2725
2726 return params, kwo_params, self.return_annotation
2727
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002728 def __hash__(self):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002729 params, kwo_params, return_annotation = self._hash_basis()
2730 kwo_params = frozenset(kwo_params.values())
2731 return hash((params, kwo_params, return_annotation))
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002732
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002733 def __eq__(self, other):
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002734 if self is other:
2735 return True
Serhiy Storchaka3018cc42015-07-18 23:19:05 +03002736 if not isinstance(other, Signature):
2737 return NotImplemented
Serhiy Storchaka2489bd52015-07-18 23:20:50 +03002738 return self._hash_basis() == other._hash_basis()
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002739
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002740 def _bind(self, args, kwargs, *, partial=False):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002741 """Private method. Don't use directly."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002742
2743 arguments = OrderedDict()
2744
2745 parameters = iter(self.parameters.values())
2746 parameters_ex = ()
2747 arg_vals = iter(args)
2748
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002749 while True:
2750 # Let's iterate through the positional arguments and corresponding
2751 # parameters
2752 try:
2753 arg_val = next(arg_vals)
2754 except StopIteration:
2755 # No more positional arguments
2756 try:
2757 param = next(parameters)
2758 except StopIteration:
2759 # No more parameters. That's it. Just need to check that
2760 # we have no `kwargs` after this while loop
2761 break
2762 else:
2763 if param.kind == _VAR_POSITIONAL:
2764 # That's OK, just empty *args. Let's start parsing
2765 # kwargs
2766 break
2767 elif param.name in kwargs:
2768 if param.kind == _POSITIONAL_ONLY:
2769 msg = '{arg!r} parameter is positional only, ' \
2770 'but was passed as a keyword'
2771 msg = msg.format(arg=param.name)
2772 raise TypeError(msg) from None
2773 parameters_ex = (param,)
2774 break
2775 elif (param.kind == _VAR_KEYWORD or
2776 param.default is not _empty):
2777 # That's fine too - we have a default value for this
2778 # parameter. So, lets start parsing `kwargs`, starting
2779 # with the current parameter
2780 parameters_ex = (param,)
2781 break
2782 else:
Yury Selivanov38b0d5a2014-01-28 17:27:39 -05002783 # No default, not VAR_KEYWORD, not VAR_POSITIONAL,
2784 # not in `kwargs`
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002785 if partial:
2786 parameters_ex = (param,)
2787 break
2788 else:
Yury Selivanov86872752015-05-19 00:27:49 -04002789 msg = 'missing a required argument: {arg!r}'
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002790 msg = msg.format(arg=param.name)
2791 raise TypeError(msg) from None
2792 else:
2793 # We have a positional argument to process
2794 try:
2795 param = next(parameters)
2796 except StopIteration:
2797 raise TypeError('too many positional arguments') from None
2798 else:
2799 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
2800 # Looks like we have no parameter for this positional
2801 # argument
Yury Selivanov86872752015-05-19 00:27:49 -04002802 raise TypeError(
2803 'too many positional arguments') from None
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002804
2805 if param.kind == _VAR_POSITIONAL:
2806 # We have an '*args'-like argument, let's fill it with
2807 # all positional arguments we have left and move on to
2808 # the next phase
2809 values = [arg_val]
2810 values.extend(arg_vals)
2811 arguments[param.name] = tuple(values)
2812 break
2813
2814 if param.name in kwargs:
Yury Selivanov86872752015-05-19 00:27:49 -04002815 raise TypeError(
2816 'multiple values for argument {arg!r}'.format(
2817 arg=param.name)) from None
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002818
2819 arguments[param.name] = arg_val
2820
2821 # Now, we iterate through the remaining parameters to process
2822 # keyword arguments
2823 kwargs_param = None
2824 for param in itertools.chain(parameters_ex, parameters):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002825 if param.kind == _VAR_KEYWORD:
2826 # Memorize that we have a '**kwargs'-like parameter
2827 kwargs_param = param
2828 continue
2829
Yury Selivanov38b0d5a2014-01-28 17:27:39 -05002830 if param.kind == _VAR_POSITIONAL:
2831 # Named arguments don't refer to '*args'-like parameters.
2832 # We only arrive here if the positional arguments ended
2833 # before reaching the last parameter before *args.
2834 continue
2835
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002836 param_name = param.name
2837 try:
2838 arg_val = kwargs.pop(param_name)
2839 except KeyError:
2840 # We have no value for this parameter. It's fine though,
2841 # if it has a default value, or it is an '*args'-like
2842 # parameter, left alone by the processing of positional
2843 # arguments.
2844 if (not partial and param.kind != _VAR_POSITIONAL and
2845 param.default is _empty):
Yury Selivanov86872752015-05-19 00:27:49 -04002846 raise TypeError('missing a required argument: {arg!r}'. \
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002847 format(arg=param_name)) from None
2848
2849 else:
Yury Selivanov9b9ac952014-01-28 20:54:28 -05002850 if param.kind == _POSITIONAL_ONLY:
2851 # This should never happen in case of a properly built
2852 # Signature object (but let's have this check here
2853 # to ensure correct behaviour just in case)
2854 raise TypeError('{arg!r} parameter is positional only, '
2855 'but was passed as a keyword'. \
2856 format(arg=param.name))
2857
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002858 arguments[param_name] = arg_val
2859
2860 if kwargs:
2861 if kwargs_param is not None:
2862 # Process our '**kwargs'-like parameter
2863 arguments[kwargs_param.name] = kwargs
2864 else:
Yury Selivanov86872752015-05-19 00:27:49 -04002865 raise TypeError(
2866 'got an unexpected keyword argument {arg!r}'.format(
2867 arg=next(iter(kwargs))))
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002868
2869 return self._bound_arguments_cls(self, arguments)
2870
Yury Selivanovc45873e2014-01-29 12:10:27 -05002871 def bind(*args, **kwargs):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002872 """Get a BoundArguments object, that maps the passed `args`
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002873 and `kwargs` to the function's signature. Raises `TypeError`
2874 if the passed arguments can not be bound.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002875 """
Yury Selivanovc45873e2014-01-29 12:10:27 -05002876 return args[0]._bind(args[1:], kwargs)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002877
Yury Selivanovc45873e2014-01-29 12:10:27 -05002878 def bind_partial(*args, **kwargs):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002879 """Get a BoundArguments object, that partially maps the
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002880 passed `args` and `kwargs` to the function's signature.
2881 Raises `TypeError` if the passed arguments can not be bound.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002882 """
Yury Selivanovc45873e2014-01-29 12:10:27 -05002883 return args[0]._bind(args[1:], kwargs, partial=True)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002884
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002885 def __reduce__(self):
2886 return (type(self),
2887 (tuple(self._parameters.values()),),
2888 {'_return_annotation': self._return_annotation})
2889
2890 def __setstate__(self, state):
2891 self._return_annotation = state['_return_annotation']
2892
Yury Selivanov374375d2014-03-27 12:41:53 -04002893 def __repr__(self):
Yury Selivanovf229bc52015-05-15 12:53:56 -04002894 return '<{} {}>'.format(self.__class__.__name__, self)
Yury Selivanov374375d2014-03-27 12:41:53 -04002895
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002896 def __str__(self):
2897 result = []
Yury Selivanov2393dca2014-01-27 15:07:58 -05002898 render_pos_only_separator = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002899 render_kw_only_separator = True
Yury Selivanov2393dca2014-01-27 15:07:58 -05002900 for param in self.parameters.values():
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002901 formatted = str(param)
2902
2903 kind = param.kind
Yury Selivanov2393dca2014-01-27 15:07:58 -05002904
2905 if kind == _POSITIONAL_ONLY:
2906 render_pos_only_separator = True
2907 elif render_pos_only_separator:
2908 # It's not a positional-only parameter, and the flag
2909 # is set to 'True' (there were pos-only params before.)
2910 result.append('/')
2911 render_pos_only_separator = False
2912
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002913 if kind == _VAR_POSITIONAL:
2914 # OK, we have an '*args'-like parameter, so we won't need
2915 # a '*' to separate keyword-only arguments
2916 render_kw_only_separator = False
2917 elif kind == _KEYWORD_ONLY and render_kw_only_separator:
2918 # We have a keyword-only parameter to render and we haven't
2919 # rendered an '*args'-like parameter before, so add a '*'
2920 # separator to the parameters list ("foo(arg1, *, arg2)" case)
2921 result.append('*')
2922 # This condition should be only triggered once, so
2923 # reset the flag
2924 render_kw_only_separator = False
2925
2926 result.append(formatted)
2927
Yury Selivanov2393dca2014-01-27 15:07:58 -05002928 if render_pos_only_separator:
2929 # There were only positional-only parameters, hence the
2930 # flag was not reset to 'False'
2931 result.append('/')
2932
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002933 rendered = '({})'.format(', '.join(result))
2934
2935 if self.return_annotation is not _empty:
2936 anno = formatannotation(self.return_annotation)
2937 rendered += ' -> {}'.format(anno)
2938
2939 return rendered
Nick Coghlanf94a16b2013-09-22 22:46:49 +10002940
Yury Selivanovda396452014-03-27 12:09:24 -04002941
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002942def signature(obj, *, follow_wrapped=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002943 """Get a signature object for the passed callable."""
Yury Selivanovbcd4fc12015-05-20 14:30:08 -04002944 return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
Yury Selivanovda396452014-03-27 12:09:24 -04002945
2946
Nick Coghlanf94a16b2013-09-22 22:46:49 +10002947def _main():
2948 """ Logic for inspecting an object given at command line """
2949 import argparse
2950 import importlib
2951
2952 parser = argparse.ArgumentParser()
2953 parser.add_argument(
2954 'object',
2955 help="The object to be analysed. "
2956 "It supports the 'module:qualname' syntax")
2957 parser.add_argument(
2958 '-d', '--details', action='store_true',
2959 help='Display info about the module rather than its source code')
2960
2961 args = parser.parse_args()
2962
2963 target = args.object
2964 mod_name, has_attrs, attrs = target.partition(":")
2965 try:
2966 obj = module = importlib.import_module(mod_name)
2967 except Exception as exc:
2968 msg = "Failed to import {} ({}: {})".format(mod_name,
2969 type(exc).__name__,
2970 exc)
2971 print(msg, file=sys.stderr)
2972 exit(2)
2973
2974 if has_attrs:
2975 parts = attrs.split(".")
2976 obj = module
2977 for part in parts:
2978 obj = getattr(obj, part)
2979
2980 if module.__name__ in sys.builtin_module_names:
2981 print("Can't get info for builtin modules.", file=sys.stderr)
2982 exit(1)
2983
2984 if args.details:
2985 print('Target: {}'.format(target))
2986 print('Origin: {}'.format(getsourcefile(module)))
2987 print('Cached: {}'.format(module.__cached__))
2988 if obj is module:
2989 print('Loader: {}'.format(repr(module.__loader__)))
2990 if hasattr(module, '__path__'):
2991 print('Submodule search path: {}'.format(module.__path__))
2992 else:
2993 try:
2994 __, lineno = findsource(obj)
2995 except Exception:
2996 pass
2997 else:
2998 print('Line: {}'.format(lineno))
2999
3000 print('\n')
3001 else:
3002 print(getsource(obj))
3003
3004
3005if __name__ == "__main__":
3006 _main()