blob: 98d665dd45f7fe76dd3ae6d840b503a3e2674f77 [file] [log] [blame]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001"""Get useful information from live Python objects.
2
3This module encapsulates the interface provided by the internal special
Neal Norwitz221085d2007-02-25 20:55:47 +00004attributes (co_*, im_*, tb_*, etc.) in a friendlier fashion.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00005It also provides some help for examining source code and class layout.
6
7Here are some of the useful functions provided by this module:
8
Christian Heimes7131fd92008-02-19 14:21:46 +00009 ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(),
10 isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(),
11 isroutine() - check object types
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000012 getmembers() - get members of an object that satisfy a given condition
13
14 getfile(), getsourcefile(), getsource() - find an object's source code
15 getdoc(), getcomments() - get documentation on an object
16 getmodule() - determine the module that an object came from
17 getclasstree() - arrange classes so as to represent their hierarchy
18
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +000019 getargspec(), getargvalues(), getcallargs() - get info about function arguments
Yury Selivanov0cf3ed62014-04-01 10:17:08 -040020 getfullargspec() - same, with support for Python 3 features
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000021 formatargspec(), formatargvalues() - format an argument spec
22 getouterframes(), getinnerframes() - get info about frames
23 currentframe() - get the current stack frame
24 stack(), trace() - get info about frames on the stack or in a traceback
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070025
26 signature() - get a Signature object for the callable
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000027"""
28
29# This module is in the public domain. No warranties.
30
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070031__author__ = ('Ka-Ping Yee <ping@lfw.org>',
32 'Yury Selivanov <yselivanov@sprymix.com>')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000033
Larry Hastings44e2eaa2013-11-23 15:37:55 -080034import ast
Yury Selivanov21e83a52014-03-27 11:23:13 -040035import enum
Brett Cannoncb66eb02012-05-11 12:58:42 -040036import importlib.machinery
37import itertools
Christian Heimes7131fd92008-02-19 14:21:46 +000038import linecache
Brett Cannoncb66eb02012-05-11 12:58:42 -040039import os
40import re
41import sys
42import tokenize
Larry Hastings2623c8c2014-02-08 22:15:29 -080043import token
Brett Cannoncb66eb02012-05-11 12:58:42 -040044import types
Brett Cannon2b88fcf2012-06-02 22:28:42 -040045import warnings
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070046import functools
Nick Coghlan2f92e542012-06-23 19:39:55 +100047import builtins
Raymond Hettingera1a992c2005-03-11 06:46:45 +000048from operator import attrgetter
Larry Hastings7c7cbfc2012-06-22 15:19:35 -070049from collections import namedtuple, OrderedDict
Nick Coghlan09c81232010-08-17 10:18:16 +000050
51# Create constants for the compiler flags in Include/code.h
52# We try to get them from dis to avoid duplication, but fall
Berker Peksagf23530f2014-10-19 18:04:38 +030053# back to hard-coding so the dependency is optional
Nick Coghlan09c81232010-08-17 10:18:16 +000054try:
55 from dis import COMPILER_FLAG_NAMES as _flag_names
Brett Cannoncd171c82013-07-04 17:43:24 -040056except ImportError:
Nick Coghlan09c81232010-08-17 10:18:16 +000057 CO_OPTIMIZED, CO_NEWLOCALS = 0x1, 0x2
58 CO_VARARGS, CO_VARKEYWORDS = 0x4, 0x8
59 CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
60else:
61 mod_dict = globals()
62 for k, v in _flag_names.items():
63 mod_dict["CO_" + v] = k
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000064
Christian Heimesbe5b30b2008-03-03 19:18:51 +000065# See Include/object.h
66TPFLAGS_IS_ABSTRACT = 1 << 20
67
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000068# ----------------------------------------------------------- type-checking
69def ismodule(object):
70 """Return true if the object is a module.
71
72 Module objects provide these attributes:
Barry Warsaw28a691b2010-04-17 00:19:56 +000073 __cached__ pathname to byte compiled file
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000074 __doc__ documentation string
75 __file__ filename (missing for built-in modules)"""
Tim Peters28bc59f2001-09-16 08:40:16 +000076 return isinstance(object, types.ModuleType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000077
78def isclass(object):
79 """Return true if the object is a class.
80
81 Class objects provide these attributes:
82 __doc__ documentation string
83 __module__ name of module in which this class was defined"""
Benjamin Petersonc4656002009-01-17 22:41:18 +000084 return isinstance(object, type)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000085
86def ismethod(object):
87 """Return true if the object is an instance method.
88
89 Instance method objects provide these attributes:
90 __doc__ documentation string
91 __name__ name with which this method was defined
Christian Heimesff737952007-11-27 10:40:20 +000092 __func__ function object containing implementation of method
93 __self__ instance to which this method is bound"""
Tim Peters28bc59f2001-09-16 08:40:16 +000094 return isinstance(object, types.MethodType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000095
Tim Peters536d2262001-09-20 05:13:38 +000096def ismethoddescriptor(object):
Tim Petersf1d90b92001-09-20 05:47:55 +000097 """Return true if the object is a method descriptor.
98
99 But not if ismethod() or isclass() or isfunction() are true.
Tim Peters536d2262001-09-20 05:13:38 +0000100
101 This is new in Python 2.2, and, for example, is true of int.__add__.
102 An object passing this test has a __get__ attribute but not a __set__
103 attribute, but beyond that the set of attributes varies. __name__ is
104 usually sensible, and __doc__ often is.
105
Tim Petersf1d90b92001-09-20 05:47:55 +0000106 Methods implemented via descriptors that also pass one of the other
107 tests return false from the ismethoddescriptor() test, simply because
108 the other tests promise more -- you can, e.g., count on having the
Christian Heimesff737952007-11-27 10:40:20 +0000109 __func__ attribute (etc) when an object passes ismethod()."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100110 if isclass(object) or ismethod(object) or isfunction(object):
111 # mutual exclusion
112 return False
113 tp = type(object)
114 return hasattr(tp, "__get__") and not hasattr(tp, "__set__")
Tim Peters536d2262001-09-20 05:13:38 +0000115
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000116def isdatadescriptor(object):
117 """Return true if the object is a data descriptor.
118
119 Data descriptors have both a __get__ and a __set__ attribute. Examples are
120 properties (defined in Python) and getsets and members (defined in C).
121 Typically, data descriptors will also have __name__ and __doc__ attributes
122 (properties, getsets, and members have both of these attributes), but this
123 is not guaranteed."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100124 if isclass(object) or ismethod(object) or isfunction(object):
125 # mutual exclusion
126 return False
127 tp = type(object)
128 return hasattr(tp, "__set__") and hasattr(tp, "__get__")
Martin v. Löwise59e2ba2003-05-03 09:09:02 +0000129
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000130if hasattr(types, 'MemberDescriptorType'):
131 # CPython and equivalent
132 def ismemberdescriptor(object):
133 """Return true if the object is a member descriptor.
134
135 Member descriptors are specialized descriptors defined in extension
136 modules."""
137 return isinstance(object, types.MemberDescriptorType)
138else:
139 # Other implementations
140 def ismemberdescriptor(object):
141 """Return true if the object is a member descriptor.
142
143 Member descriptors are specialized descriptors defined in extension
144 modules."""
145 return False
146
147if hasattr(types, 'GetSetDescriptorType'):
148 # CPython and equivalent
149 def isgetsetdescriptor(object):
150 """Return true if the object is a getset descriptor.
151
152 getset descriptors are specialized descriptors defined in extension
153 modules."""
154 return isinstance(object, types.GetSetDescriptorType)
155else:
156 # Other implementations
157 def isgetsetdescriptor(object):
158 """Return true if the object is a getset descriptor.
159
160 getset descriptors are specialized descriptors defined in extension
161 modules."""
162 return False
163
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000164def isfunction(object):
165 """Return true if the object is a user-defined function.
166
167 Function objects provide these attributes:
168 __doc__ documentation string
169 __name__ name with which this function was defined
Neal Norwitz221085d2007-02-25 20:55:47 +0000170 __code__ code object containing compiled function bytecode
171 __defaults__ tuple of any default values for arguments
172 __globals__ global namespace in which this function was defined
173 __annotations__ dict of parameter annotations
174 __kwdefaults__ dict of keyword only parameters with defaults"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000175 return isinstance(object, types.FunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000176
Christian Heimes7131fd92008-02-19 14:21:46 +0000177def isgeneratorfunction(object):
178 """Return true if the object is a user-defined generator function.
179
180 Generator function objects provides same attributes as functions.
181
Alexander Belopolsky977a6842010-08-16 20:17:07 +0000182 See help(isfunction) for attributes listing."""
Georg Brandlb1441c72009-01-03 22:33:39 +0000183 return bool((isfunction(object) or ismethod(object)) and
184 object.__code__.co_flags & CO_GENERATOR)
Christian Heimes7131fd92008-02-19 14:21:46 +0000185
186def isgenerator(object):
187 """Return true if the object is a generator.
188
189 Generator objects provide these attributes:
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300190 __iter__ defined to support iteration over container
Christian Heimes7131fd92008-02-19 14:21:46 +0000191 close raises a new GeneratorExit exception inside the
192 generator to terminate the iteration
193 gi_code code object
194 gi_frame frame object or possibly None once the generator has
195 been exhausted
196 gi_running set to 1 when generator is executing, 0 otherwise
197 next return the next item from the container
198 send resumes the generator and "sends" a value that becomes
199 the result of the current yield-expression
200 throw used to raise an exception inside the generator"""
201 return isinstance(object, types.GeneratorType)
202
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000203def istraceback(object):
204 """Return true if the object is a traceback.
205
206 Traceback objects provide these attributes:
207 tb_frame frame object at this level
208 tb_lasti index of last attempted instruction in bytecode
209 tb_lineno current line number in Python source code
210 tb_next next inner traceback object (called by this level)"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000211 return isinstance(object, types.TracebackType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000212
213def isframe(object):
214 """Return true if the object is a frame object.
215
216 Frame objects provide these attributes:
217 f_back next outer frame object (this frame's caller)
218 f_builtins built-in namespace seen by this frame
219 f_code code object being executed in this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000220 f_globals global namespace seen by this frame
221 f_lasti index of last attempted instruction in bytecode
222 f_lineno current line number in Python source code
223 f_locals local namespace seen by this frame
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000224 f_trace tracing function for this frame, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000225 return isinstance(object, types.FrameType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000226
227def iscode(object):
228 """Return true if the object is a code object.
229
230 Code objects provide these attributes:
231 co_argcount number of arguments (not including * or ** args)
232 co_code string of raw compiled bytecode
233 co_consts tuple of constants used in the bytecode
234 co_filename name of file in which this code object was created
235 co_firstlineno number of first line in Python source code
236 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
237 co_lnotab encoded mapping of line numbers to bytecode indices
238 co_name name with which this code object was defined
239 co_names tuple of names of local variables
240 co_nlocals number of local variables
241 co_stacksize virtual machine stack space required
242 co_varnames tuple of names of arguments and local variables"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000243 return isinstance(object, types.CodeType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000244
245def isbuiltin(object):
246 """Return true if the object is a built-in function or method.
247
248 Built-in functions and methods provide these attributes:
249 __doc__ documentation string
250 __name__ original name of this function or method
251 __self__ instance to which a method is bound, or None"""
Tim Peters28bc59f2001-09-16 08:40:16 +0000252 return isinstance(object, types.BuiltinFunctionType)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000253
254def isroutine(object):
255 """Return true if the object is any kind of function or method."""
Tim Peters536d2262001-09-20 05:13:38 +0000256 return (isbuiltin(object)
257 or isfunction(object)
258 or ismethod(object)
259 or ismethoddescriptor(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000260
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000261def isabstract(object):
262 """Return true if the object is an abstract base class (ABC)."""
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000263 return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT)
Christian Heimesbe5b30b2008-03-03 19:18:51 +0000264
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000265def getmembers(object, predicate=None):
266 """Return all members of an object as (name, value) pairs sorted by name.
267 Optionally, only return members that satisfy a given predicate."""
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100268 if isclass(object):
269 mro = (object,) + getmro(object)
270 else:
271 mro = ()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000272 results = []
Ethan Furmane03ea372013-09-25 07:14:41 -0700273 processed = set()
274 names = dir(object)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700275 # :dd any DynamicClassAttributes to the list of names if object is a class;
Ethan Furmane03ea372013-09-25 07:14:41 -0700276 # this may result in duplicate entries if, for example, a virtual
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700277 # attribute with the same name as a DynamicClassAttribute exists
Ethan Furmane03ea372013-09-25 07:14:41 -0700278 try:
279 for base in object.__bases__:
280 for k, v in base.__dict__.items():
281 if isinstance(v, types.DynamicClassAttribute):
282 names.append(k)
283 except AttributeError:
284 pass
285 for key in names:
Ethan Furman63c141c2013-10-18 00:27:39 -0700286 # First try to get the value via getattr. Some descriptors don't
287 # like calling their __get__ (see bug #1785), so fall back to
288 # looking in the __dict__.
289 try:
290 value = getattr(object, key)
291 # handle the duplicate key
292 if key in processed:
293 raise AttributeError
294 except AttributeError:
295 for base in mro:
296 if key in base.__dict__:
297 value = base.__dict__[key]
298 break
299 else:
300 # could be a (currently) missing slot member, or a buggy
301 # __dir__; discard and move on
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100302 continue
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000303 if not predicate or predicate(value):
304 results.append((key, value))
Ethan Furmane03ea372013-09-25 07:14:41 -0700305 processed.add(key)
306 results.sort(key=lambda pair: pair[0])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000307 return results
308
Christian Heimes25bb7832008-01-11 16:17:00 +0000309Attribute = namedtuple('Attribute', 'name kind defining_class object')
310
Tim Peters13b49d32001-09-23 02:00:29 +0000311def classify_class_attrs(cls):
312 """Return list of attribute-descriptor tuples.
313
314 For each name in dir(cls), the return list contains a 4-tuple
315 with these elements:
316
317 0. The name (a string).
318
319 1. The kind of attribute this is, one of these strings:
320 'class method' created via classmethod()
321 'static method' created via staticmethod()
322 'property' created via property()
Ethan Furmane03ea372013-09-25 07:14:41 -0700323 'method' any other flavor of method or descriptor
Tim Peters13b49d32001-09-23 02:00:29 +0000324 'data' not a method
325
326 2. The class which defined this attribute (a class).
327
Ethan Furmane03ea372013-09-25 07:14:41 -0700328 3. The object as obtained by calling getattr; if this fails, or if the
329 resulting object does not live anywhere in the class' mro (including
330 metaclasses) then the object is looked up in the defining class's
331 dict (found by walking the mro).
Ethan Furman668dede2013-09-14 18:53:26 -0700332
333 If one of the items in dir(cls) is stored in the metaclass it will now
334 be discovered and not have None be listed as the class in which it was
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700335 defined. Any items whose home class cannot be discovered are skipped.
Tim Peters13b49d32001-09-23 02:00:29 +0000336 """
337
338 mro = getmro(cls)
Ethan Furman668dede2013-09-14 18:53:26 -0700339 metamro = getmro(type(cls)) # for attributes stored in the metaclass
Ethan Furmane03ea372013-09-25 07:14:41 -0700340 metamro = tuple([cls for cls in metamro if cls not in (type, object)])
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700341 class_bases = (cls,) + mro
342 all_bases = class_bases + metamro
Tim Peters13b49d32001-09-23 02:00:29 +0000343 names = dir(cls)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700344 # :dd any DynamicClassAttributes to the list of names;
Ethan Furmane03ea372013-09-25 07:14:41 -0700345 # this may result in duplicate entries if, for example, a virtual
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700346 # attribute with the same name as a DynamicClassAttribute exists.
Ethan Furman63c141c2013-10-18 00:27:39 -0700347 for base in mro:
Ethan Furmane03ea372013-09-25 07:14:41 -0700348 for k, v in base.__dict__.items():
349 if isinstance(v, types.DynamicClassAttribute):
350 names.append(k)
Tim Peters13b49d32001-09-23 02:00:29 +0000351 result = []
Ethan Furmane03ea372013-09-25 07:14:41 -0700352 processed = set()
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700353
Tim Peters13b49d32001-09-23 02:00:29 +0000354 for name in names:
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100355 # Get the object associated with the name, and where it was defined.
Ethan Furmane03ea372013-09-25 07:14:41 -0700356 # Normal objects will be looked up with both getattr and directly in
357 # its class' dict (in case getattr fails [bug #1785], and also to look
358 # for a docstring).
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700359 # For DynamicClassAttributes on the second pass we only look in the
Ethan Furmane03ea372013-09-25 07:14:41 -0700360 # class's dict.
361 #
Tim Peters13b49d32001-09-23 02:00:29 +0000362 # Getting an obj from the __dict__ sometimes reveals more than
363 # using getattr. Static and class methods are dramatic examples.
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100364 homecls = None
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700365 get_obj = None
366 dict_obj = None
Ethan Furmane03ea372013-09-25 07:14:41 -0700367 if name not in processed:
368 try:
Ethan Furmana8b07072013-10-18 01:22:08 -0700369 if name == '__dict__':
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700370 raise Exception("__dict__ is special, don't want the proxy")
Ethan Furmane03ea372013-09-25 07:14:41 -0700371 get_obj = getattr(cls, name)
372 except Exception as exc:
373 pass
374 else:
Ethan Furmane03ea372013-09-25 07:14:41 -0700375 homecls = getattr(get_obj, "__objclass__", homecls)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700376 if homecls not in class_bases:
Ethan Furmane03ea372013-09-25 07:14:41 -0700377 # if the resulting object does not live somewhere in the
Ethan Furman63c141c2013-10-18 00:27:39 -0700378 # mro, drop it and search the mro manually
Ethan Furmane03ea372013-09-25 07:14:41 -0700379 homecls = None
Ethan Furman63c141c2013-10-18 00:27:39 -0700380 last_cls = None
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700381 # first look in the classes
382 for srch_cls in class_bases:
Ethan Furman63c141c2013-10-18 00:27:39 -0700383 srch_obj = getattr(srch_cls, name, None)
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700384 if srch_obj == get_obj:
Ethan Furman63c141c2013-10-18 00:27:39 -0700385 last_cls = srch_cls
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700386 # then check the metaclasses
387 for srch_cls in metamro:
388 try:
389 srch_obj = srch_cls.__getattr__(cls, name)
390 except AttributeError:
391 continue
392 if srch_obj == get_obj:
393 last_cls = srch_cls
Ethan Furman63c141c2013-10-18 00:27:39 -0700394 if last_cls is not None:
395 homecls = last_cls
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700396 for base in all_bases:
Ethan Furmane03ea372013-09-25 07:14:41 -0700397 if name in base.__dict__:
398 dict_obj = base.__dict__[name]
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700399 if homecls not in metamro:
400 homecls = base
Ethan Furmane03ea372013-09-25 07:14:41 -0700401 break
Ethan Furman63c141c2013-10-18 00:27:39 -0700402 if homecls is None:
403 # unable to locate the attribute anywhere, most likely due to
404 # buggy custom __dir__; discard and move on
405 continue
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700406 obj = get_obj or dict_obj
Ethan Furmane03ea372013-09-25 07:14:41 -0700407 # Classify the object or its descriptor.
Ethan Furman63c141c2013-10-18 00:27:39 -0700408 if isinstance(dict_obj, staticmethod):
Tim Peters13b49d32001-09-23 02:00:29 +0000409 kind = "static method"
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700410 obj = dict_obj
Ethan Furman63c141c2013-10-18 00:27:39 -0700411 elif isinstance(dict_obj, classmethod):
Tim Peters13b49d32001-09-23 02:00:29 +0000412 kind = "class method"
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700413 obj = dict_obj
414 elif isinstance(dict_obj, property):
Tim Peters13b49d32001-09-23 02:00:29 +0000415 kind = "property"
Ethan Furmanb0c84cd2013-10-20 22:37:39 -0700416 obj = dict_obj
Yury Selivanov0860a0b2014-01-31 14:28:44 -0500417 elif isroutine(obj):
Tim Peters13b49d32001-09-23 02:00:29 +0000418 kind = "method"
Antoine Pitrou86a8a9a2011-12-21 09:57:40 +0100419 else:
Ethan Furmane03ea372013-09-25 07:14:41 -0700420 kind = "data"
Christian Heimes25bb7832008-01-11 16:17:00 +0000421 result.append(Attribute(name, kind, homecls, obj))
Ethan Furmane03ea372013-09-25 07:14:41 -0700422 processed.add(name)
Tim Peters13b49d32001-09-23 02:00:29 +0000423 return result
424
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000425# ----------------------------------------------------------- class helpers
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000426
427def getmro(cls):
428 "Return tuple of base classes (including cls) in method resolution order."
Benjamin Petersonb82c8e52010-11-04 00:38:49 +0000429 return cls.__mro__
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000430
Nick Coghlane8c45d62013-07-28 20:00:01 +1000431# -------------------------------------------------------- function helpers
432
433def unwrap(func, *, stop=None):
434 """Get the object wrapped by *func*.
435
436 Follows the chain of :attr:`__wrapped__` attributes returning the last
437 object in the chain.
438
439 *stop* is an optional callback accepting an object in the wrapper chain
440 as its sole argument that allows the unwrapping to be terminated early if
441 the callback returns a true value. If the callback never returns a true
442 value, the last object in the chain is returned as usual. For example,
443 :func:`signature` uses this to stop unwrapping if any object in the
444 chain has a ``__signature__`` attribute defined.
445
446 :exc:`ValueError` is raised if a cycle is encountered.
447
448 """
449 if stop is None:
450 def _is_wrapper(f):
451 return hasattr(f, '__wrapped__')
452 else:
453 def _is_wrapper(f):
454 return hasattr(f, '__wrapped__') and not stop(f)
455 f = func # remember the original func for error reporting
456 memo = {id(f)} # Memoise by id to tolerate non-hashable objects
457 while _is_wrapper(func):
458 func = func.__wrapped__
459 id_func = id(func)
460 if id_func in memo:
461 raise ValueError('wrapper loop when unwrapping {!r}'.format(f))
462 memo.add(id_func)
463 return func
464
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000465# -------------------------------------------------- source code extraction
466def indentsize(line):
467 """Return the indent size, in spaces, at the start of a line of text."""
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000468 expline = line.expandtabs()
469 return len(expline) - len(expline.lstrip())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000470
471def getdoc(object):
472 """Get the documentation string for an object.
473
474 All tabs are expanded to spaces. To clean up docstrings that are
475 indented to line up with blocks of code, any whitespace than can be
476 uniformly removed from the second line onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000477 try:
478 doc = object.__doc__
479 except AttributeError:
480 return None
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000481 if not isinstance(doc, str):
Tim Peters24008312002-03-17 18:56:20 +0000482 return None
Georg Brandl0c77a822008-06-10 16:37:50 +0000483 return cleandoc(doc)
484
485def cleandoc(doc):
486 """Clean up indentation from docstrings.
487
488 Any whitespace that can be uniformly removed from the second line
489 onwards is removed."""
Tim Peters24008312002-03-17 18:56:20 +0000490 try:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000491 lines = doc.expandtabs().split('\n')
Tim Peters24008312002-03-17 18:56:20 +0000492 except UnicodeError:
493 return None
494 else:
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000495 # Find minimum indentation of any non-blank lines after first line.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000496 margin = sys.maxsize
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000497 for line in lines[1:]:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000498 content = len(line.lstrip())
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000499 if content:
500 indent = len(line) - content
501 margin = min(margin, indent)
502 # Remove indentation.
503 if lines:
504 lines[0] = lines[0].lstrip()
Christian Heimesa37d4c62007-12-04 23:02:19 +0000505 if margin < sys.maxsize:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000506 for i in range(1, len(lines)): lines[i] = lines[i][margin:]
Ka-Ping Yeea59ef7b2002-11-30 03:53:15 +0000507 # Remove any trailing or leading blank lines.
508 while lines and not lines[-1]:
509 lines.pop()
510 while lines and not lines[0]:
511 lines.pop(0)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000512 return '\n'.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000513
514def getfile(object):
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000515 """Work out which source or compiled file an object was defined in."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000516 if ismodule(object):
517 if hasattr(object, '__file__'):
518 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000519 raise TypeError('{!r} is a built-in module'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000520 if isclass(object):
Yury Selivanov2eed8b72014-01-27 13:24:56 -0500521 if hasattr(object, '__module__'):
522 object = sys.modules.get(object.__module__)
523 if hasattr(object, '__file__'):
524 return object.__file__
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000525 raise TypeError('{!r} is a built-in class'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000526 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000527 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000528 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000529 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000530 if istraceback(object):
531 object = object.tb_frame
532 if isframe(object):
533 object = object.f_code
534 if iscode(object):
535 return object.co_filename
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000536 raise TypeError('{!r} is not a module, class, method, '
537 'function, traceback, frame, or code object'.format(object))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000538
Christian Heimes25bb7832008-01-11 16:17:00 +0000539ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
540
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000541def getmoduleinfo(path):
542 """Get the module name, suffix, mode, and module type for a given file."""
Brett Cannoncb66eb02012-05-11 12:58:42 -0400543 warnings.warn('inspect.getmoduleinfo() is deprecated', DeprecationWarning,
544 2)
Brett Cannone4f41de2013-06-16 13:13:40 -0400545 with warnings.catch_warnings():
546 warnings.simplefilter('ignore', PendingDeprecationWarning)
547 import imp
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000548 filename = os.path.basename(path)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000549 suffixes = [(-len(suffix), suffix, mode, mtype)
550 for suffix, mode, mtype in imp.get_suffixes()]
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000551 suffixes.sort() # try longest suffixes first, in case they overlap
552 for neglen, suffix, mode, mtype in suffixes:
553 if filename[neglen:] == suffix:
Christian Heimes25bb7832008-01-11 16:17:00 +0000554 return ModuleInfo(filename[:neglen], suffix, mode, mtype)
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000555
556def getmodulename(path):
557 """Return the module name for a given file, or None."""
Nick Coghlan76e07702012-07-18 23:14:57 +1000558 fname = os.path.basename(path)
559 # Check for paths that look like an actual module file
560 suffixes = [(-len(suffix), suffix)
561 for suffix in importlib.machinery.all_suffixes()]
562 suffixes.sort() # try longest suffixes first, in case they overlap
563 for neglen, suffix in suffixes:
564 if fname.endswith(suffix):
565 return fname[:neglen]
566 return None
Ka-Ping Yee4d6fc7f2001-04-10 11:43:00 +0000567
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000568def getsourcefile(object):
R. David Murraya1b37402010-06-17 02:04:29 +0000569 """Return the filename that can be used to locate an object's source.
570 Return None if no way can be identified to get the source.
571 """
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000572 filename = getfile(object)
Brett Cannoncb66eb02012-05-11 12:58:42 -0400573 all_bytecode_suffixes = importlib.machinery.DEBUG_BYTECODE_SUFFIXES[:]
574 all_bytecode_suffixes += importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES[:]
575 if any(filename.endswith(s) for s in all_bytecode_suffixes):
576 filename = (os.path.splitext(filename)[0] +
577 importlib.machinery.SOURCE_SUFFIXES[0])
578 elif any(filename.endswith(s) for s in
579 importlib.machinery.EXTENSION_SUFFIXES):
580 return None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000581 if os.path.exists(filename):
582 return filename
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000583 # only return a non-existent filename if the module has a PEP 302 loader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400584 if getattr(getmodule(object, filename), '__loader__', None) is not None:
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000585 return filename
R. David Murraya1b37402010-06-17 02:04:29 +0000586 # or it is in the linecache
587 if filename in linecache.cache:
588 return filename
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000589
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000590def getabsfile(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000591 """Return an absolute path to the source or compiled file for an object.
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000592
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000593 The idea is for each object to have a unique origin, so this routine
594 normalizes the result as much as possible."""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000595 if _filename is None:
596 _filename = getsourcefile(object) or getfile(object)
597 return os.path.normcase(os.path.abspath(_filename))
Ka-Ping Yeec113c242001-03-02 02:08:53 +0000598
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000599modulesbyfile = {}
Thomas Wouters89f507f2006-12-13 04:49:30 +0000600_filesbymodname = {}
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000601
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000602def getmodule(object, _filename=None):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000603 """Return the module an object was defined in, or None if not found."""
Ka-Ping Yee202c99b2001-04-13 09:15:08 +0000604 if ismodule(object):
605 return object
Johannes Gijsbers93245262004-09-11 15:53:22 +0000606 if hasattr(object, '__module__'):
Ka-Ping Yee8b58b842001-03-01 13:56:16 +0000607 return sys.modules.get(object.__module__)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000608 # Try the filename to modulename cache
609 if _filename is not None and _filename in modulesbyfile:
610 return sys.modules.get(modulesbyfile[_filename])
611 # Try the cache again with the absolute file name
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000612 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613 file = getabsfile(object, _filename)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000614 except TypeError:
615 return None
Raymond Hettinger54f02222002-06-01 14:18:47 +0000616 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000617 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000618 # Update the filename to module name cache and check yet again
619 # Copy sys.modules in order to cope with changes while iterating
Éric Araujoa74f8ef2011-11-29 16:58:53 +0100620 for modname, module in list(sys.modules.items()):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000621 if ismodule(module) and hasattr(module, '__file__'):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000622 f = module.__file__
623 if f == _filesbymodname.get(modname, None):
624 # Have already mapped this module, so skip it
625 continue
626 _filesbymodname[modname] = f
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000627 f = getabsfile(module)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000628 # Always map to the name the module knows itself by
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000629 modulesbyfile[f] = modulesbyfile[
630 os.path.realpath(f)] = module.__name__
Raymond Hettinger54f02222002-06-01 14:18:47 +0000631 if file in modulesbyfile:
Ka-Ping Yeeb38bbbd2003-03-28 16:29:50 +0000632 return sys.modules.get(modulesbyfile[file])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000633 # Check the main module
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000634 main = sys.modules['__main__']
Brett Cannon4a671fe2003-06-15 22:33:28 +0000635 if not hasattr(object, '__name__'):
636 return None
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000637 if hasattr(main, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000638 mainobject = getattr(main, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000639 if mainobject is object:
640 return main
Thomas Wouters89f507f2006-12-13 04:49:30 +0000641 # Check builtins
Georg Brandl1a3284e2007-12-02 09:40:06 +0000642 builtin = sys.modules['builtins']
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000643 if hasattr(builtin, object.__name__):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000644 builtinobject = getattr(builtin, object.__name__)
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000645 if builtinobject is object:
646 return builtin
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000647
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000648def findsource(object):
649 """Return the entire source file and starting line number for an object.
650
651 The argument may be a module, class, method, function, traceback, frame,
652 or code object. The source code is returned as a list of all the lines
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200653 in the file and the line number indexes a line in that list. An OSError
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000654 is raised if the source code cannot be retrieved."""
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500655
Yury Selivanovef1e7502014-12-08 16:05:34 -0500656 file = getsourcefile(object)
657 if file:
658 # Invalidate cache if needed.
659 linecache.checkcache(file)
660 else:
661 file = getfile(object)
662 # Allow filenames in form of "<something>" to pass through.
663 # `doctest` monkeypatches `linecache` module to enable
664 # inspection, so let `linecache.getlines` to be called.
665 if not (file.startswith('<') and file.endswith('>')):
666 raise OSError('source code not available')
Benjamin Peterson9620cc02011-06-11 15:53:11 -0500667
Thomas Wouters89f507f2006-12-13 04:49:30 +0000668 module = getmodule(object, file)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000669 if module:
670 lines = linecache.getlines(file, module.__dict__)
671 else:
672 lines = linecache.getlines(file)
Neil Schemenauerf06f8532002-03-23 23:51:04 +0000673 if not lines:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200674 raise OSError('could not get source code')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000675
676 if ismodule(object):
677 return lines, 0
678
679 if isclass(object):
680 name = object.__name__
Thomas Wouters89f507f2006-12-13 04:49:30 +0000681 pat = re.compile(r'^(\s*)class\s*' + name + r'\b')
682 # make some effort to find the best matching class definition:
683 # use the one with the least indentation, which is the one
684 # that's most probably not inside a function definition.
685 candidates = []
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000686 for i in range(len(lines)):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000687 match = pat.match(lines[i])
688 if match:
689 # if it's at toplevel, it's already the best one
690 if lines[i][0] == 'c':
691 return lines, i
692 # else add whitespace to candidate list
693 candidates.append((match.group(1), i))
694 if candidates:
695 # this will sort by whitespace, and by line number,
696 # less whitespace first
697 candidates.sort()
698 return lines, candidates[0][1]
Jeremy Hyltonab919022003-06-27 18:41:20 +0000699 else:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200700 raise OSError('could not find class definition')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000701
702 if ismethod(object):
Christian Heimesff737952007-11-27 10:40:20 +0000703 object = object.__func__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000704 if isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000705 object = object.__code__
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000706 if istraceback(object):
707 object = object.tb_frame
708 if isframe(object):
709 object = object.f_code
710 if iscode(object):
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000711 if not hasattr(object, 'co_firstlineno'):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200712 raise OSError('could not find function definition')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000713 lnum = object.co_firstlineno - 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000714 pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000715 while lnum > 0:
Ka-Ping Yeea6e59712001-03-10 09:31:55 +0000716 if pat.match(lines[lnum]): break
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +0000717 lnum = lnum - 1
718 return lines, lnum
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200719 raise OSError('could not find code object')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000720
721def getcomments(object):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000722 """Get lines of comments immediately preceding an object's source code.
723
724 Returns None when source can't be found.
725 """
726 try:
727 lines, lnum = findsource(object)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200728 except (OSError, TypeError):
Jeremy Hyltonb4c17c82002-03-28 23:01:56 +0000729 return None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000730
731 if ismodule(object):
732 # Look for a comment block at the top of the file.
733 start = 0
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000734 if lines and lines[0][:2] == '#!': start = 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000735 while start < len(lines) and lines[start].strip() in ('', '#'):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000736 start = start + 1
Ka-Ping Yeeb910efe2001-04-12 13:17:17 +0000737 if start < len(lines) and lines[start][:1] == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000738 comments = []
739 end = start
740 while end < len(lines) and lines[end][:1] == '#':
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000741 comments.append(lines[end].expandtabs())
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000742 end = end + 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000743 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000744
745 # Look for a preceding block of comments at the same indentation.
746 elif lnum > 0:
747 indent = indentsize(lines[lnum])
748 end = lnum - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000749 if end >= 0 and lines[end].lstrip()[:1] == '#' and \
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000750 indentsize(lines[end]) == indent:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000751 comments = [lines[end].expandtabs().lstrip()]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000752 if end > 0:
753 end = end - 1
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000754 comment = lines[end].expandtabs().lstrip()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000755 while comment[:1] == '#' and indentsize(lines[end]) == indent:
756 comments[:0] = [comment]
757 end = end - 1
758 if end < 0: break
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000759 comment = lines[end].expandtabs().lstrip()
760 while comments and comments[0].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000761 comments[:1] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000762 while comments and comments[-1].strip() == '#':
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000763 comments[-1:] = []
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000764 return ''.join(comments)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000765
Tim Peters4efb6e92001-06-29 23:51:08 +0000766class EndOfBlock(Exception): pass
767
768class BlockFinder:
769 """Provide a tokeneater() method to detect the end of a code block."""
770 def __init__(self):
771 self.indent = 0
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000772 self.islambda = False
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000773 self.started = False
774 self.passline = False
Armin Rigodd5c0232005-09-25 11:45:45 +0000775 self.last = 1
Tim Peters4efb6e92001-06-29 23:51:08 +0000776
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000777 def tokeneater(self, type, token, srowcol, erowcol, line):
Tim Peters4efb6e92001-06-29 23:51:08 +0000778 if not self.started:
Armin Rigodd5c0232005-09-25 11:45:45 +0000779 # look for the first "def", "class" or "lambda"
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000780 if token in ("def", "class", "lambda"):
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000781 if token == "lambda":
782 self.islambda = True
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000783 self.started = True
Armin Rigodd5c0232005-09-25 11:45:45 +0000784 self.passline = True # skip to the end of the line
Tim Peters4efb6e92001-06-29 23:51:08 +0000785 elif type == tokenize.NEWLINE:
Armin Rigodd5c0232005-09-25 11:45:45 +0000786 self.passline = False # stop skipping when a NEWLINE is seen
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000787 self.last = srowcol[0]
Armin Rigodd5c0232005-09-25 11:45:45 +0000788 if self.islambda: # lambdas always end at the first NEWLINE
789 raise EndOfBlock
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000790 elif self.passline:
791 pass
Tim Peters4efb6e92001-06-29 23:51:08 +0000792 elif type == tokenize.INDENT:
793 self.indent = self.indent + 1
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000794 self.passline = True
Tim Peters4efb6e92001-06-29 23:51:08 +0000795 elif type == tokenize.DEDENT:
796 self.indent = self.indent - 1
Armin Rigodd5c0232005-09-25 11:45:45 +0000797 # the end of matching indent/dedent pairs end a block
798 # (note that this only works for "def"/"class" blocks,
799 # not e.g. for "if: else:" or "try: finally:" blocks)
800 if self.indent <= 0:
801 raise EndOfBlock
802 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
803 # any other token on the same indentation level end the previous
804 # block as well, except the pseudo-tokens COMMENT and NL.
805 raise EndOfBlock
Tim Peters4efb6e92001-06-29 23:51:08 +0000806
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000807def getblock(lines):
808 """Extract the block of code at the top of the given list of lines."""
Armin Rigodd5c0232005-09-25 11:45:45 +0000809 blockfinder = BlockFinder()
Tim Peters4efb6e92001-06-29 23:51:08 +0000810 try:
Trent Nelson428de652008-03-18 22:41:35 +0000811 tokens = tokenize.generate_tokens(iter(lines).__next__)
812 for _token in tokens:
813 blockfinder.tokeneater(*_token)
Armin Rigodd5c0232005-09-25 11:45:45 +0000814 except (EndOfBlock, IndentationError):
815 pass
816 return lines[:blockfinder.last]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000817
818def getsourcelines(object):
819 """Return a list of source lines and starting line number for an object.
820
821 The argument may be a module, class, method, function, traceback, frame,
822 or code object. The source code is returned as a list of the lines
823 corresponding to the object and the line number indicates where in the
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200824 original source file the first line of code was found. An OSError is
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000825 raised if the source code cannot be retrieved."""
Yury Selivanov081bbf62014-09-26 17:34:54 -0400826 object = unwrap(object)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000827 lines, lnum = findsource(object)
828
829 if ismodule(object): return lines, 0
830 else: return getblock(lines[lnum:]), lnum + 1
831
832def getsource(object):
833 """Return the text of the source code for an object.
834
835 The argument may be a module, class, method, function, traceback, frame,
836 or code object. The source code is returned as a single string. An
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200837 OSError is raised if the source code cannot be retrieved."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000838 lines, lnum = getsourcelines(object)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000839 return ''.join(lines)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000840
841# --------------------------------------------------- class tree extraction
842def walktree(classes, children, parent):
843 """Recursive helper function for getclasstree()."""
844 results = []
Raymond Hettingera1a992c2005-03-11 06:46:45 +0000845 classes.sort(key=attrgetter('__module__', '__name__'))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000846 for c in classes:
847 results.append((c, c.__bases__))
Raymond Hettinger54f02222002-06-01 14:18:47 +0000848 if c in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000849 results.append(walktree(children[c], children, c))
850 return results
851
Georg Brandl5ce83a02009-06-01 17:23:51 +0000852def getclasstree(classes, unique=False):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000853 """Arrange the given list of classes into a hierarchy of nested lists.
854
855 Where a nested list appears, it contains classes derived from the class
856 whose entry immediately precedes the list. Each entry is a 2-tuple
857 containing a class and a tuple of its base classes. If the 'unique'
858 argument is true, exactly one entry appears in the returned structure
859 for each class in the given list. Otherwise, classes using multiple
860 inheritance and their descendants will appear multiple times."""
861 children = {}
862 roots = []
863 for c in classes:
864 if c.__bases__:
865 for parent in c.__bases__:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000866 if not parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000867 children[parent] = []
Serhiy Storchaka362c1b52013-09-05 17:14:32 +0300868 if c not in children[parent]:
869 children[parent].append(c)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000870 if unique and parent in classes: break
871 elif c not in roots:
872 roots.append(c)
Raymond Hettingere0d49722002-06-02 18:55:56 +0000873 for parent in children:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000874 if parent not in classes:
875 roots.append(parent)
876 return walktree(roots, children, None)
877
878# ------------------------------------------------ argument list extraction
Christian Heimes25bb7832008-01-11 16:17:00 +0000879Arguments = namedtuple('Arguments', 'args, varargs, varkw')
880
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000881def getargs(co):
882 """Get information about the arguments accepted by a code object.
883
Guido van Rossum2e65f892007-02-28 22:03:49 +0000884 Three things are returned: (args, varargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000885 'args' is the list of argument names. Keyword-only arguments are
886 appended. 'varargs' and 'varkw' are the names of the * and **
887 arguments or None."""
Guido van Rossum2e65f892007-02-28 22:03:49 +0000888 args, varargs, kwonlyargs, varkw = _getfullargs(co)
Christian Heimes25bb7832008-01-11 16:17:00 +0000889 return Arguments(args + kwonlyargs, varargs, varkw)
Guido van Rossum2e65f892007-02-28 22:03:49 +0000890
891def _getfullargs(co):
892 """Get information about the arguments accepted by a code object.
893
894 Four things are returned: (args, varargs, kwonlyargs, varkw), where
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000895 'args' and 'kwonlyargs' are lists of argument names, and 'varargs'
896 and 'varkw' are the names of the * and ** arguments or None."""
Jeremy Hylton64967882003-06-27 18:14:39 +0000897
898 if not iscode(co):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000899 raise TypeError('{!r} is not a code object'.format(co))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000900
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000901 nargs = co.co_argcount
902 names = co.co_varnames
Guido van Rossum2e65f892007-02-28 22:03:49 +0000903 nkwargs = co.co_kwonlyargcount
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000904 args = list(names[:nargs])
Guido van Rossum2e65f892007-02-28 22:03:49 +0000905 kwonlyargs = list(names[nargs:nargs+nkwargs])
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000906 step = 0
907
Guido van Rossum2e65f892007-02-28 22:03:49 +0000908 nargs += nkwargs
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000909 varargs = None
910 if co.co_flags & CO_VARARGS:
911 varargs = co.co_varnames[nargs]
912 nargs = nargs + 1
913 varkw = None
914 if co.co_flags & CO_VARKEYWORDS:
915 varkw = co.co_varnames[nargs]
Guido van Rossum2e65f892007-02-28 22:03:49 +0000916 return args, varargs, kwonlyargs, varkw
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000917
Christian Heimes25bb7832008-01-11 16:17:00 +0000918
919ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
920
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000921def getargspec(func):
922 """Get the names and default values of a function's arguments.
923
Guido van Rossume82881c2014-07-15 12:29:11 -0700924 A tuple of four things is returned: (args, varargs, keywords, defaults).
925 'args' is a list of the argument names, including keyword-only argument names.
926 'varargs' and 'keywords' are the names of the * and ** arguments or None.
Jeremy Hylton64967882003-06-27 18:14:39 +0000927 'defaults' is an n-tuple of the default values of the last n arguments.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000928
Yury Selivanov0cf3ed62014-04-01 10:17:08 -0400929 Use the getfullargspec() API for Python 3 code, as annotations
Guido van Rossum2e65f892007-02-28 22:03:49 +0000930 and keyword arguments are supported. getargspec() will raise ValueError
931 if the func has either annotations or keyword arguments.
932 """
933
934 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
935 getfullargspec(func)
936 if kwonlyargs or ann:
Collin Winterce36ad82007-08-30 01:19:48 +0000937 raise ValueError("Function has keyword-only arguments or annotations"
938 ", use getfullargspec() API which can support them")
Christian Heimes25bb7832008-01-11 16:17:00 +0000939 return ArgSpec(args, varargs, varkw, defaults)
940
941FullArgSpec = namedtuple('FullArgSpec',
Benjamin Peterson3d4ca742008-11-12 21:39:01 +0000942 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations')
Guido van Rossum2e65f892007-02-28 22:03:49 +0000943
944def getfullargspec(func):
Yury Selivanovd82eddc2014-01-29 11:24:39 -0500945 """Get the names and default values of a callable object's arguments.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000946
Brett Cannon504d8852007-09-07 02:12:14 +0000947 A tuple of seven things is returned:
948 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults annotations).
Georg Brandlc1c4bf82010-10-15 16:07:41 +0000949 'args' is a list of the argument names.
Guido van Rossum2e65f892007-02-28 22:03:49 +0000950 'varargs' and 'varkw' are the names of the * and ** arguments or None.
951 'defaults' is an n-tuple of the default values of the last n arguments.
952 'kwonlyargs' is a list of keyword-only argument names.
953 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults.
954 'annotations' is a dictionary mapping argument names to annotations.
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000955
Guido van Rossum2e65f892007-02-28 22:03:49 +0000956 The first four items in the tuple correspond to getargspec().
Jeremy Hylton64967882003-06-27 18:14:39 +0000957 """
958
Yury Selivanov57d240e2014-02-19 16:27:23 -0500959 try:
960 # Re: `skip_bound_arg=False`
961 #
Yury Selivanovd82eddc2014-01-29 11:24:39 -0500962 # There is a notable difference in behaviour between getfullargspec
963 # and Signature: the former always returns 'self' parameter for bound
964 # methods, whereas the Signature always shows the actual calling
965 # signature of the passed object.
966 #
967 # To simulate this behaviour, we "unbind" bound methods, to trick
968 # inspect.signature to always return their first parameter ("self",
969 # usually)
Yury Selivanovd82eddc2014-01-29 11:24:39 -0500970
Yury Selivanov57d240e2014-02-19 16:27:23 -0500971 # Re: `follow_wrapper_chains=False`
972 #
973 # getfullargspec() historically ignored __wrapped__ attributes,
974 # so we ensure that remains the case in 3.3+
Yury Selivanovd82eddc2014-01-29 11:24:39 -0500975
Yury Selivanov5a23bd02014-03-29 13:47:11 -0400976 sig = _signature_from_callable(func,
977 follow_wrapper_chains=False,
978 skip_bound_arg=False,
979 sigcls=Signature)
Yury Selivanovd82eddc2014-01-29 11:24:39 -0500980 except Exception as ex:
981 # Most of the times 'signature' will raise ValueError.
982 # But, it can also raise AttributeError, and, maybe something
983 # else. So to be fully backwards compatible, we catch all
984 # possible exceptions here, and reraise a TypeError.
985 raise TypeError('unsupported callable') from ex
986
987 args = []
988 varargs = None
989 varkw = None
990 kwonlyargs = []
991 defaults = ()
992 annotations = {}
993 defaults = ()
994 kwdefaults = {}
995
996 if sig.return_annotation is not sig.empty:
997 annotations['return'] = sig.return_annotation
998
999 for param in sig.parameters.values():
1000 kind = param.kind
1001 name = param.name
1002
1003 if kind is _POSITIONAL_ONLY:
1004 args.append(name)
1005 elif kind is _POSITIONAL_OR_KEYWORD:
1006 args.append(name)
1007 if param.default is not param.empty:
1008 defaults += (param.default,)
1009 elif kind is _VAR_POSITIONAL:
1010 varargs = name
1011 elif kind is _KEYWORD_ONLY:
1012 kwonlyargs.append(name)
1013 if param.default is not param.empty:
1014 kwdefaults[name] = param.default
1015 elif kind is _VAR_KEYWORD:
1016 varkw = name
1017
1018 if param.annotation is not param.empty:
1019 annotations[name] = param.annotation
1020
1021 if not kwdefaults:
1022 # compatibility with 'func.__kwdefaults__'
1023 kwdefaults = None
1024
1025 if not defaults:
1026 # compatibility with 'func.__defaults__'
1027 defaults = None
1028
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001029 return FullArgSpec(args, varargs, varkw, defaults,
1030 kwonlyargs, kwdefaults, annotations)
1031
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001032
Christian Heimes25bb7832008-01-11 16:17:00 +00001033ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
1034
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001035def getargvalues(frame):
1036 """Get information about arguments passed into a particular frame.
1037
1038 A tuple of four things is returned: (args, varargs, varkw, locals).
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001039 'args' is a list of the argument names.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001040 'varargs' and 'varkw' are the names of the * and ** arguments or None.
1041 'locals' is the locals dictionary of the given frame."""
1042 args, varargs, varkw = getargs(frame.f_code)
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001043 return ArgInfo(args, varargs, varkw, frame.f_locals)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001044
Guido van Rossum2e65f892007-02-28 22:03:49 +00001045def formatannotation(annotation, base_module=None):
1046 if isinstance(annotation, type):
Georg Brandl1a3284e2007-12-02 09:40:06 +00001047 if annotation.__module__ in ('builtins', base_module):
Serhiy Storchaka521e5862014-07-22 15:00:37 +03001048 return annotation.__qualname__
1049 return annotation.__module__+'.'+annotation.__qualname__
Guido van Rossum2e65f892007-02-28 22:03:49 +00001050 return repr(annotation)
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001051
Guido van Rossum2e65f892007-02-28 22:03:49 +00001052def formatannotationrelativeto(object):
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001053 module = getattr(object, '__module__', None)
1054 def _formatannotation(annotation):
1055 return formatannotation(annotation, module)
1056 return _formatannotation
Guido van Rossum2e65f892007-02-28 22:03:49 +00001057
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001058def formatargspec(args, varargs=None, varkw=None, defaults=None,
Guido van Rossum2e65f892007-02-28 22:03:49 +00001059 kwonlyargs=(), kwonlydefaults={}, annotations={},
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001060 formatarg=str,
1061 formatvarargs=lambda name: '*' + name,
1062 formatvarkw=lambda name: '**' + name,
1063 formatvalue=lambda value: '=' + repr(value),
Guido van Rossum2e65f892007-02-28 22:03:49 +00001064 formatreturns=lambda text: ' -> ' + text,
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001065 formatannotation=formatannotation):
Guido van Rossuma8add0e2007-05-14 22:03:55 +00001066 """Format an argument spec from the values returned by getargspec
Guido van Rossum2e65f892007-02-28 22:03:49 +00001067 or getfullargspec.
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001068
Guido van Rossum2e65f892007-02-28 22:03:49 +00001069 The first seven arguments are (args, varargs, varkw, defaults,
1070 kwonlyargs, kwonlydefaults, annotations). The other five arguments
1071 are the corresponding optional formatting functions that are called to
1072 turn names and values into strings. The last argument is an optional
1073 function to format the sequence of arguments."""
1074 def formatargandannotation(arg):
1075 result = formatarg(arg)
1076 if arg in annotations:
1077 result += ': ' + formatannotation(annotations[arg])
1078 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001079 specs = []
1080 if defaults:
1081 firstdefault = len(args) - len(defaults)
Benjamin Petersonb58dda72009-01-18 22:27:04 +00001082 for i, arg in enumerate(args):
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001083 spec = formatargandannotation(arg)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001084 if defaults and i >= firstdefault:
1085 spec = spec + formatvalue(defaults[i - firstdefault])
1086 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +00001087 if varargs is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001088 specs.append(formatvarargs(formatargandannotation(varargs)))
1089 else:
1090 if kwonlyargs:
1091 specs.append('*')
1092 if kwonlyargs:
1093 for kwonlyarg in kwonlyargs:
1094 spec = formatargandannotation(kwonlyarg)
Benjamin Peterson9953a8d2009-01-17 04:15:01 +00001095 if kwonlydefaults and kwonlyarg in kwonlydefaults:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001096 spec += formatvalue(kwonlydefaults[kwonlyarg])
1097 specs.append(spec)
Raymond Hettinger936654b2002-06-01 03:06:31 +00001098 if varkw is not None:
Guido van Rossum2e65f892007-02-28 22:03:49 +00001099 specs.append(formatvarkw(formatargandannotation(varkw)))
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001100 result = '(' + ', '.join(specs) + ')'
Guido van Rossum2e65f892007-02-28 22:03:49 +00001101 if 'return' in annotations:
1102 result += formatreturns(formatannotation(annotations['return']))
1103 return result
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001104
1105def formatargvalues(args, varargs, varkw, locals,
1106 formatarg=str,
1107 formatvarargs=lambda name: '*' + name,
1108 formatvarkw=lambda name: '**' + name,
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001109 formatvalue=lambda value: '=' + repr(value)):
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001110 """Format an argument spec from the 4 values returned by getargvalues.
1111
1112 The first four arguments are (args, varargs, varkw, locals). The
1113 next four arguments are the corresponding optional formatting functions
1114 that are called to turn names and values into strings. The ninth
1115 argument is an optional function to format the sequence of arguments."""
1116 def convert(name, locals=locals,
1117 formatarg=formatarg, formatvalue=formatvalue):
1118 return formatarg(name) + formatvalue(locals[name])
1119 specs = []
1120 for i in range(len(args)):
Georg Brandlc1c4bf82010-10-15 16:07:41 +00001121 specs.append(convert(args[i]))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001122 if varargs:
1123 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
1124 if varkw:
1125 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001126 return '(' + ', '.join(specs) + ')'
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001127
Benjamin Petersone109c702011-06-24 09:37:26 -05001128def _missing_arguments(f_name, argnames, pos, values):
1129 names = [repr(name) for name in argnames if name not in values]
1130 missing = len(names)
1131 if missing == 1:
1132 s = names[0]
1133 elif missing == 2:
1134 s = "{} and {}".format(*names)
1135 else:
Yury Selivanovdccfa132014-03-27 18:42:52 -04001136 tail = ", {} and {}".format(*names[-2:])
Benjamin Petersone109c702011-06-24 09:37:26 -05001137 del names[-2:]
1138 s = ", ".join(names) + tail
1139 raise TypeError("%s() missing %i required %s argument%s: %s" %
1140 (f_name, missing,
1141 "positional" if pos else "keyword-only",
1142 "" if missing == 1 else "s", s))
1143
1144def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
Benjamin Petersonb204a422011-06-05 22:04:07 -05001145 atleast = len(args) - defcount
Benjamin Petersonb204a422011-06-05 22:04:07 -05001146 kwonly_given = len([arg for arg in kwonly if arg in values])
1147 if varargs:
1148 plural = atleast != 1
1149 sig = "at least %d" % (atleast,)
1150 elif defcount:
1151 plural = True
1152 sig = "from %d to %d" % (atleast, len(args))
1153 else:
1154 plural = len(args) != 1
1155 sig = str(len(args))
1156 kwonly_sig = ""
1157 if kwonly_given:
1158 msg = " positional argument%s (and %d keyword-only argument%s)"
1159 kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
1160 "s" if kwonly_given != 1 else ""))
1161 raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
1162 (f_name, sig, "s" if plural else "", given, kwonly_sig,
1163 "was" if given == 1 and not kwonly_given else "were"))
1164
Benjamin Peterson3e6ab172014-01-02 12:24:08 -06001165def getcallargs(*func_and_positional, **named):
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001166 """Get the mapping of arguments to values.
1167
1168 A dict is returned, with keys the function argument names (including the
1169 names of the * and ** arguments, if any), and values the respective bound
1170 values from 'positional' and 'named'."""
Benjamin Peterson3e6ab172014-01-02 12:24:08 -06001171 func = func_and_positional[0]
1172 positional = func_and_positional[1:]
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001173 spec = getfullargspec(func)
1174 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
1175 f_name = func.__name__
1176 arg2value = {}
1177
Benjamin Petersonb204a422011-06-05 22:04:07 -05001178
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001179 if ismethod(func) and func.__self__ is not None:
1180 # implicit 'self' (or 'cls' for classmethods) argument
1181 positional = (func.__self__,) + positional
1182 num_pos = len(positional)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001183 num_args = len(args)
1184 num_defaults = len(defaults) if defaults else 0
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001185
Benjamin Petersonb204a422011-06-05 22:04:07 -05001186 n = min(num_pos, num_args)
1187 for i in range(n):
1188 arg2value[args[i]] = positional[i]
1189 if varargs:
1190 arg2value[varargs] = tuple(positional[n:])
1191 possible_kwargs = set(args + kwonlyargs)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001192 if varkw:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001193 arg2value[varkw] = {}
1194 for kw, value in named.items():
1195 if kw not in possible_kwargs:
1196 if not varkw:
1197 raise TypeError("%s() got an unexpected keyword argument %r" %
1198 (f_name, kw))
1199 arg2value[varkw][kw] = value
1200 continue
1201 if kw in arg2value:
1202 raise TypeError("%s() got multiple values for argument %r" %
1203 (f_name, kw))
1204 arg2value[kw] = value
1205 if num_pos > num_args and not varargs:
Benjamin Petersone109c702011-06-24 09:37:26 -05001206 _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
1207 num_pos, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001208 if num_pos < num_args:
Benjamin Petersone109c702011-06-24 09:37:26 -05001209 req = args[:num_args - num_defaults]
1210 for arg in req:
Benjamin Petersonb204a422011-06-05 22:04:07 -05001211 if arg not in arg2value:
Benjamin Petersone109c702011-06-24 09:37:26 -05001212 _missing_arguments(f_name, req, True, arg2value)
Benjamin Petersonb204a422011-06-05 22:04:07 -05001213 for i, arg in enumerate(args[num_args - num_defaults:]):
1214 if arg not in arg2value:
1215 arg2value[arg] = defaults[i]
Benjamin Petersone109c702011-06-24 09:37:26 -05001216 missing = 0
Benjamin Petersonb204a422011-06-05 22:04:07 -05001217 for kwarg in kwonlyargs:
1218 if kwarg not in arg2value:
Yury Selivanov875df202014-03-27 18:23:03 -04001219 if kwonlydefaults and kwarg in kwonlydefaults:
Benjamin Petersone109c702011-06-24 09:37:26 -05001220 arg2value[kwarg] = kwonlydefaults[kwarg]
1221 else:
1222 missing += 1
1223 if missing:
1224 _missing_arguments(f_name, kwonlyargs, False, arg2value)
Benjamin Peterson25cd7eb2010-03-30 18:42:32 +00001225 return arg2value
1226
Nick Coghlan2f92e542012-06-23 19:39:55 +10001227ClosureVars = namedtuple('ClosureVars', 'nonlocals globals builtins unbound')
1228
1229def getclosurevars(func):
1230 """
1231 Get the mapping of free variables to their current values.
1232
Meador Inge8fda3592012-07-19 21:33:21 -05001233 Returns a named tuple of dicts mapping the current nonlocal, global
Nick Coghlan2f92e542012-06-23 19:39:55 +10001234 and builtin references as seen by the body of the function. A final
1235 set of unbound names that could not be resolved is also provided.
1236 """
1237
1238 if ismethod(func):
1239 func = func.__func__
1240
1241 if not isfunction(func):
1242 raise TypeError("'{!r}' is not a Python function".format(func))
1243
1244 code = func.__code__
1245 # Nonlocal references are named in co_freevars and resolved
1246 # by looking them up in __closure__ by positional index
1247 if func.__closure__ is None:
1248 nonlocal_vars = {}
1249 else:
1250 nonlocal_vars = {
1251 var : cell.cell_contents
1252 for var, cell in zip(code.co_freevars, func.__closure__)
1253 }
1254
1255 # Global and builtin references are named in co_names and resolved
1256 # by looking them up in __globals__ or __builtins__
1257 global_ns = func.__globals__
1258 builtin_ns = global_ns.get("__builtins__", builtins.__dict__)
1259 if ismodule(builtin_ns):
1260 builtin_ns = builtin_ns.__dict__
1261 global_vars = {}
1262 builtin_vars = {}
1263 unbound_names = set()
1264 for name in code.co_names:
1265 if name in ("None", "True", "False"):
1266 # Because these used to be builtins instead of keywords, they
1267 # may still show up as name references. We ignore them.
1268 continue
1269 try:
1270 global_vars[name] = global_ns[name]
1271 except KeyError:
1272 try:
1273 builtin_vars[name] = builtin_ns[name]
1274 except KeyError:
1275 unbound_names.add(name)
1276
1277 return ClosureVars(nonlocal_vars, global_vars,
1278 builtin_vars, unbound_names)
1279
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001280# -------------------------------------------------- stack frame extraction
Christian Heimes25bb7832008-01-11 16:17:00 +00001281
1282Traceback = namedtuple('Traceback', 'filename lineno function code_context index')
1283
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001284def getframeinfo(frame, context=1):
1285 """Get information about a frame or traceback object.
1286
1287 A tuple of five things is returned: the filename, the line number of
1288 the current line, the function name, a list of lines of context from
1289 the source code, and the index of the current line within that list.
1290 The optional second argument specifies the number of lines of context
1291 to return, which are centered around the current line."""
1292 if istraceback(frame):
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001293 lineno = frame.tb_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001294 frame = frame.tb_frame
Andrew M. Kuchlingba8b6bc2004-06-05 14:11:59 +00001295 else:
1296 lineno = frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001297 if not isframe(frame):
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001298 raise TypeError('{!r} is not a frame or traceback object'.format(frame))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001299
Neil Schemenauerf06f8532002-03-23 23:51:04 +00001300 filename = getsourcefile(frame) or getfile(frame)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001301 if context > 0:
Guido van Rossum54e54c62001-09-04 19:14:14 +00001302 start = lineno - 1 - context//2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001303 try:
1304 lines, lnum = findsource(frame)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001305 except OSError:
Ka-Ping Yee4eb0c002001-03-02 05:50:34 +00001306 lines = index = None
1307 else:
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001308 start = max(start, 1)
Raymond Hettingera0501712004-06-15 11:22:53 +00001309 start = max(0, min(start, len(lines) - context))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001310 lines = lines[start:start+context]
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001311 index = lineno - 1 - start
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001312 else:
1313 lines = index = None
1314
Christian Heimes25bb7832008-01-11 16:17:00 +00001315 return Traceback(filename, lineno, frame.f_code.co_name, lines, index)
Ka-Ping Yee59ade082001-03-01 03:55:35 +00001316
1317def getlineno(frame):
1318 """Get the line number from a frame object, allowing for optimization."""
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001319 # FrameType.f_lineno is now a descriptor that grovels co_lnotab
1320 return frame.f_lineno
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001321
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001322FrameInfo = namedtuple('FrameInfo', ('frame',) + Traceback._fields)
1323
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001324def getouterframes(frame, context=1):
1325 """Get a list of records for a frame and all higher (calling) frames.
1326
1327 Each record contains a frame object, filename, line number, function
1328 name, a list of lines of context, and index within the context."""
1329 framelist = []
1330 while frame:
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001331 frameinfo = (frame,) + getframeinfo(frame, context)
1332 framelist.append(FrameInfo(*frameinfo))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001333 frame = frame.f_back
1334 return framelist
1335
1336def getinnerframes(tb, context=1):
1337 """Get a list of records for a traceback's frame and all lower frames.
1338
1339 Each record contains a frame object, filename, line number, function
1340 name, a list of lines of context, and index within the context."""
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001341 framelist = []
1342 while tb:
Antoine Pitroucdcafb72014-08-24 10:50:28 -04001343 frameinfo = (tb.tb_frame,) + getframeinfo(tb, context)
1344 framelist.append(FrameInfo(*frameinfo))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001345 tb = tb.tb_next
1346 return framelist
1347
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001348def currentframe():
Benjamin Petersona3a3fc62010-08-09 15:49:56 +00001349 """Return the frame of the caller or None if this is not possible."""
Benjamin Peterson42ac4752010-08-09 13:05:35 +00001350 return sys._getframe(1) if hasattr(sys, "_getframe") else None
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001351
1352def stack(context=1):
1353 """Return a list of records for the stack above the caller's frame."""
Jeremy Hyltonab919022003-06-27 18:41:20 +00001354 return getouterframes(sys._getframe(1), context)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00001355
1356def trace(context=1):
Tim Peters85ba6732001-02-28 08:26:44 +00001357 """Return a list of records for the stack below the current exception."""
Fred Draked451ec12002-04-26 02:29:55 +00001358 return getinnerframes(sys.exc_info()[2], context)
Michael Foord95fc51d2010-11-20 15:07:30 +00001359
1360
1361# ------------------------------------------------ static version of getattr
1362
1363_sentinel = object()
1364
Michael Foorde5162652010-11-20 16:40:44 +00001365def _static_getmro(klass):
1366 return type.__dict__['__mro__'].__get__(klass)
1367
Michael Foord95fc51d2010-11-20 15:07:30 +00001368def _check_instance(obj, attr):
1369 instance_dict = {}
1370 try:
1371 instance_dict = object.__getattribute__(obj, "__dict__")
1372 except AttributeError:
1373 pass
Michael Foorddcebe0f2011-03-15 19:20:44 -04001374 return dict.get(instance_dict, attr, _sentinel)
Michael Foord95fc51d2010-11-20 15:07:30 +00001375
1376
1377def _check_class(klass, attr):
Michael Foorde5162652010-11-20 16:40:44 +00001378 for entry in _static_getmro(klass):
Michael Foorda51623b2011-12-18 22:01:40 +00001379 if _shadowed_dict(type(entry)) is _sentinel:
Michael Foorddcebe0f2011-03-15 19:20:44 -04001380 try:
1381 return entry.__dict__[attr]
1382 except KeyError:
1383 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001384 return _sentinel
1385
Michael Foord35184ed2010-11-20 16:58:30 +00001386def _is_type(obj):
1387 try:
1388 _static_getmro(obj)
1389 except TypeError:
1390 return False
1391 return True
1392
Michael Foorddcebe0f2011-03-15 19:20:44 -04001393def _shadowed_dict(klass):
1394 dict_attr = type.__dict__["__dict__"]
1395 for entry in _static_getmro(klass):
1396 try:
1397 class_dict = dict_attr.__get__(entry)["__dict__"]
1398 except KeyError:
1399 pass
1400 else:
1401 if not (type(class_dict) is types.GetSetDescriptorType and
1402 class_dict.__name__ == "__dict__" and
1403 class_dict.__objclass__ is entry):
Michael Foorda51623b2011-12-18 22:01:40 +00001404 return class_dict
1405 return _sentinel
Michael Foord95fc51d2010-11-20 15:07:30 +00001406
1407def getattr_static(obj, attr, default=_sentinel):
1408 """Retrieve attributes without triggering dynamic lookup via the
1409 descriptor protocol, __getattr__ or __getattribute__.
1410
1411 Note: this function may not be able to retrieve all attributes
1412 that getattr can fetch (like dynamically created attributes)
1413 and may find attributes that getattr can't (like descriptors
1414 that raise AttributeError). It can also return descriptor objects
1415 instead of instance members in some cases. See the
1416 documentation for details.
1417 """
1418 instance_result = _sentinel
Michael Foord35184ed2010-11-20 16:58:30 +00001419 if not _is_type(obj):
Michael Foordcc7ebb82010-11-20 16:20:16 +00001420 klass = type(obj)
Michael Foorda51623b2011-12-18 22:01:40 +00001421 dict_attr = _shadowed_dict(klass)
1422 if (dict_attr is _sentinel or
1423 type(dict_attr) is types.MemberDescriptorType):
Michael Foorddcebe0f2011-03-15 19:20:44 -04001424 instance_result = _check_instance(obj, attr)
Michael Foord95fc51d2010-11-20 15:07:30 +00001425 else:
1426 klass = obj
1427
1428 klass_result = _check_class(klass, attr)
1429
1430 if instance_result is not _sentinel and klass_result is not _sentinel:
1431 if (_check_class(type(klass_result), '__get__') is not _sentinel and
1432 _check_class(type(klass_result), '__set__') is not _sentinel):
1433 return klass_result
1434
1435 if instance_result is not _sentinel:
1436 return instance_result
1437 if klass_result is not _sentinel:
1438 return klass_result
1439
1440 if obj is klass:
1441 # for types we check the metaclass too
Michael Foorde5162652010-11-20 16:40:44 +00001442 for entry in _static_getmro(type(klass)):
Michael Foord3ba95f82011-12-22 01:13:37 +00001443 if _shadowed_dict(type(entry)) is _sentinel:
1444 try:
1445 return entry.__dict__[attr]
1446 except KeyError:
1447 pass
Michael Foord95fc51d2010-11-20 15:07:30 +00001448 if default is not _sentinel:
1449 return default
1450 raise AttributeError(attr)
Nick Coghlane0f04652010-11-21 03:44:04 +00001451
1452
Nick Coghlan04e2e3f2012-06-23 19:52:05 +10001453# ------------------------------------------------ generator introspection
1454
Nick Coghlan7921b9f2010-11-30 06:36:04 +00001455GEN_CREATED = 'GEN_CREATED'
1456GEN_RUNNING = 'GEN_RUNNING'
1457GEN_SUSPENDED = 'GEN_SUSPENDED'
1458GEN_CLOSED = 'GEN_CLOSED'
Nick Coghlane0f04652010-11-21 03:44:04 +00001459
1460def getgeneratorstate(generator):
1461 """Get current state of a generator-iterator.
1462
1463 Possible states are:
1464 GEN_CREATED: Waiting to start execution.
1465 GEN_RUNNING: Currently being executed by the interpreter.
1466 GEN_SUSPENDED: Currently suspended at a yield expression.
1467 GEN_CLOSED: Execution has completed.
1468 """
1469 if generator.gi_running:
1470 return GEN_RUNNING
1471 if generator.gi_frame is None:
1472 return GEN_CLOSED
1473 if generator.gi_frame.f_lasti == -1:
1474 return GEN_CREATED
1475 return GEN_SUSPENDED
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001476
1477
Nick Coghlan04e2e3f2012-06-23 19:52:05 +10001478def getgeneratorlocals(generator):
1479 """
1480 Get the mapping of generator local variables to their current values.
1481
1482 A dict is returned, with the keys the local variable names and values the
1483 bound values."""
1484
1485 if not isgenerator(generator):
1486 raise TypeError("'{!r}' is not a Python generator".format(generator))
1487
1488 frame = getattr(generator, "gi_frame", None)
1489 if frame is not None:
1490 return generator.gi_frame.f_locals
1491 else:
1492 return {}
1493
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001494###############################################################################
1495### Function Signature Object (PEP 362)
1496###############################################################################
1497
1498
1499_WrapperDescriptor = type(type.__call__)
1500_MethodWrapper = type(all.__call__)
Larry Hastings5c661892014-01-24 06:17:25 -08001501_ClassMethodWrapper = type(int.__dict__['from_bytes'])
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001502
1503_NonUserDefinedCallables = (_WrapperDescriptor,
1504 _MethodWrapper,
Larry Hastings5c661892014-01-24 06:17:25 -08001505 _ClassMethodWrapper,
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001506 types.BuiltinFunctionType)
1507
1508
Yury Selivanov421f0c72014-01-29 12:05:40 -05001509def _signature_get_user_defined_method(cls, method_name):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001510 """Private helper. Checks if ``cls`` has an attribute
1511 named ``method_name`` and returns it only if it is a
1512 pure python function.
1513 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001514 try:
1515 meth = getattr(cls, method_name)
1516 except AttributeError:
1517 return
1518 else:
1519 if not isinstance(meth, _NonUserDefinedCallables):
1520 # Once '__signature__' will be added to 'C'-level
1521 # callables, this check won't be necessary
1522 return meth
1523
1524
Yury Selivanov62560fb2014-01-28 12:26:24 -05001525def _signature_get_partial(wrapped_sig, partial, extra_args=()):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001526 """Private helper to calculate how 'wrapped_sig' signature will
1527 look like after applying a 'functools.partial' object (or alike)
1528 on it.
1529 """
Yury Selivanov62560fb2014-01-28 12:26:24 -05001530
Yury Selivanov3f73ca22014-04-08 11:30:45 -04001531 old_params = wrapped_sig.parameters
1532 new_params = OrderedDict(old_params.items())
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001533
1534 partial_args = partial.args or ()
1535 partial_keywords = partial.keywords or {}
1536
1537 if extra_args:
1538 partial_args = extra_args + partial_args
1539
1540 try:
1541 ba = wrapped_sig.bind_partial(*partial_args, **partial_keywords)
1542 except TypeError as ex:
1543 msg = 'partial object {!r} has incorrect arguments'.format(partial)
1544 raise ValueError(msg) from ex
1545
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001546
Yury Selivanov3f73ca22014-04-08 11:30:45 -04001547 transform_to_kwonly = False
1548 for param_name, param in old_params.items():
1549 try:
1550 arg_value = ba.arguments[param_name]
1551 except KeyError:
1552 pass
1553 else:
1554 if param.kind is _POSITIONAL_ONLY:
1555 # If positional-only parameter is bound by partial,
1556 # it effectively disappears from the signature
1557 new_params.pop(param_name)
1558 continue
1559
1560 if param.kind is _POSITIONAL_OR_KEYWORD:
1561 if param_name in partial_keywords:
1562 # This means that this parameter, and all parameters
1563 # after it should be keyword-only (and var-positional
1564 # should be removed). Here's why. Consider the following
1565 # function:
1566 # foo(a, b, *args, c):
1567 # pass
1568 #
1569 # "partial(foo, a='spam')" will have the following
1570 # signature: "(*, a='spam', b, c)". Because attempting
1571 # to call that partial with "(10, 20)" arguments will
1572 # raise a TypeError, saying that "a" argument received
1573 # multiple values.
1574 transform_to_kwonly = True
1575 # Set the new default value
1576 new_params[param_name] = param.replace(default=arg_value)
1577 else:
1578 # was passed as a positional argument
1579 new_params.pop(param.name)
1580 continue
1581
1582 if param.kind is _KEYWORD_ONLY:
1583 # Set the new default value
1584 new_params[param_name] = param.replace(default=arg_value)
1585
1586 if transform_to_kwonly:
1587 assert param.kind is not _POSITIONAL_ONLY
1588
1589 if param.kind is _POSITIONAL_OR_KEYWORD:
1590 new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY)
1591 new_params[param_name] = new_param
1592 new_params.move_to_end(param_name)
1593 elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD):
1594 new_params.move_to_end(param_name)
1595 elif param.kind is _VAR_POSITIONAL:
1596 new_params.pop(param.name)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001597
1598 return wrapped_sig.replace(parameters=new_params.values())
1599
1600
Yury Selivanov62560fb2014-01-28 12:26:24 -05001601def _signature_bound_method(sig):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001602 """Private helper to transform signatures for unbound
1603 functions to bound methods.
1604 """
Yury Selivanov62560fb2014-01-28 12:26:24 -05001605
1606 params = tuple(sig.parameters.values())
1607
1608 if not params or params[0].kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
1609 raise ValueError('invalid method signature')
1610
1611 kind = params[0].kind
1612 if kind in (_POSITIONAL_OR_KEYWORD, _POSITIONAL_ONLY):
1613 # Drop first parameter:
1614 # '(p1, p2[, ...])' -> '(p2[, ...])'
1615 params = params[1:]
1616 else:
1617 if kind is not _VAR_POSITIONAL:
1618 # Unless we add a new parameter type we never
1619 # get here
1620 raise ValueError('invalid argument type')
1621 # It's a var-positional parameter.
1622 # Do nothing. '(*args[, ...])' -> '(*args[, ...])'
1623
1624 return sig.replace(parameters=params)
1625
1626
Yury Selivanovb77511d2014-01-29 10:46:14 -05001627def _signature_is_builtin(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001628 """Private helper to test if `obj` is a callable that might
1629 support Argument Clinic's __text_signature__ protocol.
1630 """
Yury Selivanov1d241832014-02-02 12:51:20 -05001631 return (isbuiltin(obj) or
Yury Selivanovb77511d2014-01-29 10:46:14 -05001632 ismethoddescriptor(obj) or
Yury Selivanov1d241832014-02-02 12:51:20 -05001633 isinstance(obj, _NonUserDefinedCallables) or
Yury Selivanovb77511d2014-01-29 10:46:14 -05001634 # Can't test 'isinstance(type)' here, as it would
1635 # also be True for regular python classes
1636 obj in (type, object))
1637
1638
Yury Selivanov63da7c72014-01-31 14:48:37 -05001639def _signature_is_functionlike(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001640 """Private helper to test if `obj` is a duck type of FunctionType.
1641 A good example of such objects are functions compiled with
1642 Cython, which have all attributes that a pure Python function
1643 would have, but have their code statically compiled.
1644 """
Yury Selivanov63da7c72014-01-31 14:48:37 -05001645
1646 if not callable(obj) or isclass(obj):
1647 # All function-like objects are obviously callables,
1648 # and not classes.
1649 return False
1650
1651 name = getattr(obj, '__name__', None)
1652 code = getattr(obj, '__code__', None)
1653 defaults = getattr(obj, '__defaults__', _void) # Important to use _void ...
1654 kwdefaults = getattr(obj, '__kwdefaults__', _void) # ... and not None here
1655 annotations = getattr(obj, '__annotations__', None)
1656
1657 return (isinstance(code, types.CodeType) and
1658 isinstance(name, str) and
1659 (defaults is None or isinstance(defaults, tuple)) and
1660 (kwdefaults is None or isinstance(kwdefaults, dict)) and
1661 isinstance(annotations, dict))
1662
1663
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001664def _signature_get_bound_param(spec):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001665 """ Private helper to get first parameter name from a
1666 __text_signature__ of a builtin method, which should
1667 be in the following format: '($param1, ...)'.
1668 Assumptions are that the first argument won't have
1669 a default value or an annotation.
1670 """
Yury Selivanovd82eddc2014-01-29 11:24:39 -05001671
1672 assert spec.startswith('($')
1673
1674 pos = spec.find(',')
1675 if pos == -1:
1676 pos = spec.find(')')
1677
1678 cpos = spec.find(':')
1679 assert cpos == -1 or cpos > pos
1680
1681 cpos = spec.find('=')
1682 assert cpos == -1 or cpos > pos
1683
1684 return spec[2:pos]
1685
1686
Larry Hastings2623c8c2014-02-08 22:15:29 -08001687def _signature_strip_non_python_syntax(signature):
1688 """
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001689 Private helper function. Takes a signature in Argument Clinic's
1690 extended signature format.
1691
Larry Hastings2623c8c2014-02-08 22:15:29 -08001692 Returns a tuple of three things:
1693 * that signature re-rendered in standard Python syntax,
1694 * the index of the "self" parameter (generally 0), or None if
1695 the function does not have a "self" parameter, and
1696 * the index of the last "positional only" parameter,
1697 or None if the signature has no positional-only parameters.
1698 """
1699
1700 if not signature:
1701 return signature, None, None
1702
1703 self_parameter = None
1704 last_positional_only = None
1705
1706 lines = [l.encode('ascii') for l in signature.split('\n')]
1707 generator = iter(lines).__next__
1708 token_stream = tokenize.tokenize(generator)
1709
1710 delayed_comma = False
1711 skip_next_comma = False
1712 text = []
1713 add = text.append
1714
1715 current_parameter = 0
1716 OP = token.OP
1717 ERRORTOKEN = token.ERRORTOKEN
1718
1719 # token stream always starts with ENCODING token, skip it
1720 t = next(token_stream)
1721 assert t.type == tokenize.ENCODING
1722
1723 for t in token_stream:
1724 type, string = t.type, t.string
1725
1726 if type == OP:
1727 if string == ',':
1728 if skip_next_comma:
1729 skip_next_comma = False
1730 else:
1731 assert not delayed_comma
1732 delayed_comma = True
1733 current_parameter += 1
1734 continue
1735
1736 if string == '/':
1737 assert not skip_next_comma
1738 assert last_positional_only is None
1739 skip_next_comma = True
1740 last_positional_only = current_parameter - 1
1741 continue
1742
1743 if (type == ERRORTOKEN) and (string == '$'):
1744 assert self_parameter is None
1745 self_parameter = current_parameter
1746 continue
1747
1748 if delayed_comma:
1749 delayed_comma = False
1750 if not ((type == OP) and (string == ')')):
1751 add(', ')
1752 add(string)
1753 if (string == ','):
1754 add(' ')
1755 clean_signature = ''.join(text)
1756 return clean_signature, self_parameter, last_positional_only
1757
1758
Yury Selivanov57d240e2014-02-19 16:27:23 -05001759def _signature_fromstr(cls, obj, s, skip_bound_arg=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001760 """Private helper to parse content of '__text_signature__'
1761 and return a Signature based on it.
1762 """
1763
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001764 Parameter = cls._parameter_cls
1765
Larry Hastings2623c8c2014-02-08 22:15:29 -08001766 clean_signature, self_parameter, last_positional_only = \
1767 _signature_strip_non_python_syntax(s)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001768
Larry Hastings2623c8c2014-02-08 22:15:29 -08001769 program = "def foo" + clean_signature + ": pass"
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001770
1771 try:
Larry Hastings2623c8c2014-02-08 22:15:29 -08001772 module = ast.parse(program)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001773 except SyntaxError:
1774 module = None
1775
1776 if not isinstance(module, ast.Module):
1777 raise ValueError("{!r} builtin has invalid signature".format(obj))
1778
1779 f = module.body[0]
1780
1781 parameters = []
1782 empty = Parameter.empty
1783 invalid = object()
1784
1785 module = None
1786 module_dict = {}
1787 module_name = getattr(obj, '__module__', None)
1788 if module_name:
1789 module = sys.modules.get(module_name, None)
1790 if module:
1791 module_dict = module.__dict__
1792 sys_module_dict = sys.modules
1793
1794 def parse_name(node):
1795 assert isinstance(node, ast.arg)
1796 if node.annotation != None:
1797 raise ValueError("Annotations are not currently supported")
1798 return node.arg
1799
1800 def wrap_value(s):
1801 try:
1802 value = eval(s, module_dict)
1803 except NameError:
1804 try:
1805 value = eval(s, sys_module_dict)
1806 except NameError:
1807 raise RuntimeError()
1808
1809 if isinstance(value, str):
1810 return ast.Str(value)
1811 if isinstance(value, (int, float)):
1812 return ast.Num(value)
1813 if isinstance(value, bytes):
1814 return ast.Bytes(value)
1815 if value in (True, False, None):
1816 return ast.NameConstant(value)
1817 raise RuntimeError()
1818
1819 class RewriteSymbolics(ast.NodeTransformer):
1820 def visit_Attribute(self, node):
1821 a = []
1822 n = node
1823 while isinstance(n, ast.Attribute):
1824 a.append(n.attr)
1825 n = n.value
1826 if not isinstance(n, ast.Name):
1827 raise RuntimeError()
1828 a.append(n.id)
1829 value = ".".join(reversed(a))
1830 return wrap_value(value)
1831
1832 def visit_Name(self, node):
1833 if not isinstance(node.ctx, ast.Load):
1834 raise ValueError()
1835 return wrap_value(node.id)
1836
1837 def p(name_node, default_node, default=empty):
1838 name = parse_name(name_node)
1839 if name is invalid:
1840 return None
1841 if default_node and default_node is not _empty:
1842 try:
1843 default_node = RewriteSymbolics().visit(default_node)
1844 o = ast.literal_eval(default_node)
1845 except ValueError:
1846 o = invalid
1847 if o is invalid:
1848 return None
1849 default = o if o is not invalid else default
1850 parameters.append(Parameter(name, kind, default=default, annotation=empty))
1851
1852 # non-keyword-only parameters
1853 args = reversed(f.args.args)
1854 defaults = reversed(f.args.defaults)
1855 iter = itertools.zip_longest(args, defaults, fillvalue=None)
Larry Hastings2623c8c2014-02-08 22:15:29 -08001856 if last_positional_only is not None:
1857 kind = Parameter.POSITIONAL_ONLY
1858 else:
1859 kind = Parameter.POSITIONAL_OR_KEYWORD
1860 for i, (name, default) in enumerate(reversed(list(iter))):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001861 p(name, default)
Larry Hastings2623c8c2014-02-08 22:15:29 -08001862 if i == last_positional_only:
1863 kind = Parameter.POSITIONAL_OR_KEYWORD
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001864
1865 # *args
1866 if f.args.vararg:
1867 kind = Parameter.VAR_POSITIONAL
1868 p(f.args.vararg, empty)
1869
1870 # keyword-only arguments
1871 kind = Parameter.KEYWORD_ONLY
1872 for name, default in zip(f.args.kwonlyargs, f.args.kw_defaults):
1873 p(name, default)
1874
1875 # **kwargs
1876 if f.args.kwarg:
1877 kind = Parameter.VAR_KEYWORD
1878 p(f.args.kwarg, empty)
1879
Larry Hastings2623c8c2014-02-08 22:15:29 -08001880 if self_parameter is not None:
Yury Selivanov8c185ee2014-02-21 01:32:42 -05001881 # Possibly strip the bound argument:
1882 # - We *always* strip first bound argument if
1883 # it is a module.
1884 # - We don't strip first bound argument if
1885 # skip_bound_arg is False.
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001886 assert parameters
Yury Selivanov8c185ee2014-02-21 01:32:42 -05001887 _self = getattr(obj, '__self__', None)
1888 self_isbound = _self is not None
1889 self_ismodule = ismodule(_self)
1890 if self_isbound and (self_ismodule or skip_bound_arg):
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05001891 parameters.pop(0)
1892 else:
1893 # for builtins, self parameter is always positional-only!
1894 p = parameters[0].replace(kind=Parameter.POSITIONAL_ONLY)
1895 parameters[0] = p
1896
1897 return cls(parameters, return_annotation=cls.empty)
1898
1899
Yury Selivanov57d240e2014-02-19 16:27:23 -05001900def _signature_from_builtin(cls, func, skip_bound_arg=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001901 """Private helper function to get signature for
1902 builtin callables.
1903 """
1904
Yury Selivanov57d240e2014-02-19 16:27:23 -05001905 if not _signature_is_builtin(func):
1906 raise TypeError("{!r} is not a Python builtin "
1907 "function".format(func))
1908
1909 s = getattr(func, "__text_signature__", None)
1910 if not s:
1911 raise ValueError("no signature found for builtin {!r}".format(func))
1912
1913 return _signature_fromstr(cls, func, s, skip_bound_arg)
1914
1915
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001916def _signature_from_callable(obj, *,
1917 follow_wrapper_chains=True,
1918 skip_bound_arg=True,
1919 sigcls):
1920
1921 """Private helper function to get signature for arbitrary
1922 callable objects.
1923 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001924
1925 if not callable(obj):
1926 raise TypeError('{!r} is not a callable object'.format(obj))
1927
1928 if isinstance(obj, types.MethodType):
1929 # In this case we skip the first parameter of the underlying
1930 # function (usually `self` or `cls`).
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001931 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04001932 obj.__func__,
1933 follow_wrapper_chains=follow_wrapper_chains,
1934 skip_bound_arg=skip_bound_arg,
1935 sigcls=sigcls)
1936
Yury Selivanov57d240e2014-02-19 16:27:23 -05001937 if skip_bound_arg:
1938 return _signature_bound_method(sig)
1939 else:
1940 return sig
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001941
Nick Coghlane8c45d62013-07-28 20:00:01 +10001942 # Was this function wrapped by a decorator?
Yury Selivanov57d240e2014-02-19 16:27:23 -05001943 if follow_wrapper_chains:
1944 obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")))
Nick Coghlane8c45d62013-07-28 20:00:01 +10001945
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001946 try:
1947 sig = obj.__signature__
1948 except AttributeError:
1949 pass
1950 else:
1951 if sig is not None:
Yury Selivanov42407ab2014-06-23 10:23:50 -07001952 if not isinstance(sig, Signature):
1953 raise TypeError(
1954 'unexpected object {!r} in __signature__ '
1955 'attribute'.format(sig))
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001956 return sig
1957
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001958 try:
1959 partialmethod = obj._partialmethod
1960 except AttributeError:
1961 pass
1962 else:
Yury Selivanov0486f812014-01-29 12:18:59 -05001963 if isinstance(partialmethod, functools.partialmethod):
1964 # Unbound partialmethod (see functools.partialmethod)
1965 # This means, that we need to calculate the signature
1966 # as if it's a regular partial object, but taking into
1967 # account that the first positional argument
1968 # (usually `self`, or `cls`) will not be passed
1969 # automatically (as for boundmethods)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001970
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001971 wrapped_sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04001972 partialmethod.func,
1973 follow_wrapper_chains=follow_wrapper_chains,
1974 skip_bound_arg=skip_bound_arg,
1975 sigcls=sigcls)
1976
Yury Selivanov0486f812014-01-29 12:18:59 -05001977 sig = _signature_get_partial(wrapped_sig, partialmethod, (None,))
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001978
Yury Selivanov0486f812014-01-29 12:18:59 -05001979 first_wrapped_param = tuple(wrapped_sig.parameters.values())[0]
1980 new_params = (first_wrapped_param,) + tuple(sig.parameters.values())
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001981
Yury Selivanov0486f812014-01-29 12:18:59 -05001982 return sig.replace(parameters=new_params)
Yury Selivanovda5fe4f2014-01-27 17:28:37 -05001983
Yury Selivanov63da7c72014-01-31 14:48:37 -05001984 if isfunction(obj) or _signature_is_functionlike(obj):
1985 # If it's a pure Python function, or an object that is duck type
1986 # of a Python function (Cython functions, for instance), then:
Yury Selivanovda396452014-03-27 12:09:24 -04001987 return sigcls.from_function(obj)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001988
Yury Selivanova773de02014-02-21 18:30:53 -05001989 if _signature_is_builtin(obj):
Yury Selivanovda396452014-03-27 12:09:24 -04001990 return _signature_from_builtin(sigcls, obj,
Yury Selivanova773de02014-02-21 18:30:53 -05001991 skip_bound_arg=skip_bound_arg)
1992
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07001993 if isinstance(obj, functools.partial):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04001994 wrapped_sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04001995 obj.func,
1996 follow_wrapper_chains=follow_wrapper_chains,
1997 skip_bound_arg=skip_bound_arg,
1998 sigcls=sigcls)
Yury Selivanov62560fb2014-01-28 12:26:24 -05001999 return _signature_get_partial(wrapped_sig, obj)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002000
2001 sig = None
2002 if isinstance(obj, type):
2003 # obj is a class or a metaclass
2004
2005 # First, let's see if it has an overloaded __call__ defined
2006 # in its metaclass
Yury Selivanov421f0c72014-01-29 12:05:40 -05002007 call = _signature_get_user_defined_method(type(obj), '__call__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002008 if call is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002009 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002010 call,
2011 follow_wrapper_chains=follow_wrapper_chains,
2012 skip_bound_arg=skip_bound_arg,
2013 sigcls=sigcls)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002014 else:
2015 # Now we check if the 'obj' class has a '__new__' method
Yury Selivanov421f0c72014-01-29 12:05:40 -05002016 new = _signature_get_user_defined_method(obj, '__new__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002017 if new is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002018 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002019 new,
2020 follow_wrapper_chains=follow_wrapper_chains,
2021 skip_bound_arg=skip_bound_arg,
2022 sigcls=sigcls)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002023 else:
2024 # Finally, we should have at least __init__ implemented
Yury Selivanov421f0c72014-01-29 12:05:40 -05002025 init = _signature_get_user_defined_method(obj, '__init__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002026 if init is not None:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002027 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002028 init,
2029 follow_wrapper_chains=follow_wrapper_chains,
2030 skip_bound_arg=skip_bound_arg,
2031 sigcls=sigcls)
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002032
2033 if sig is None:
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002034 # At this point we know, that `obj` is a class, with no user-
2035 # defined '__init__', '__new__', or class-level '__call__'
2036
Larry Hastings2623c8c2014-02-08 22:15:29 -08002037 for base in obj.__mro__[:-1]:
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002038 # Since '__text_signature__' is implemented as a
2039 # descriptor that extracts text signature from the
2040 # class docstring, if 'obj' is derived from a builtin
2041 # class, its own '__text_signature__' may be 'None'.
Larry Hastings2623c8c2014-02-08 22:15:29 -08002042 # Therefore, we go through the MRO (except the last
2043 # class in there, which is 'object') to find the first
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002044 # class with non-empty text signature.
2045 try:
2046 text_sig = base.__text_signature__
2047 except AttributeError:
2048 pass
2049 else:
2050 if text_sig:
2051 # If 'obj' class has a __text_signature__ attribute:
2052 # return a signature based on it
Yury Selivanovda396452014-03-27 12:09:24 -04002053 return _signature_fromstr(sigcls, obj, text_sig)
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002054
2055 # No '__text_signature__' was found for the 'obj' class.
2056 # Last option is to check if its '__init__' is
2057 # object.__init__ or type.__init__.
Larry Hastings2623c8c2014-02-08 22:15:29 -08002058 if type not in obj.__mro__:
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002059 # We have a class (not metaclass), but no user-defined
2060 # __init__ or __new__ for it
Yury Selivanov7d2bfed2014-02-03 02:46:07 -05002061 if obj.__init__ is object.__init__:
2062 # Return a signature of 'object' builtin.
2063 return signature(object)
Yury Selivanove7dcc5e2014-01-27 19:29:45 -05002064
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002065 elif not isinstance(obj, _NonUserDefinedCallables):
2066 # An object with __call__
2067 # We also check that the 'obj' is not an instance of
2068 # _WrapperDescriptor or _MethodWrapper to avoid
2069 # infinite recursion (and even potential segfault)
Yury Selivanov421f0c72014-01-29 12:05:40 -05002070 call = _signature_get_user_defined_method(type(obj), '__call__')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002071 if call is not None:
Larry Hastings2623c8c2014-02-08 22:15:29 -08002072 try:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002073 sig = _signature_from_callable(
Yury Selivanovda396452014-03-27 12:09:24 -04002074 call,
2075 follow_wrapper_chains=follow_wrapper_chains,
2076 skip_bound_arg=skip_bound_arg,
2077 sigcls=sigcls)
Larry Hastings2623c8c2014-02-08 22:15:29 -08002078 except ValueError as ex:
2079 msg = 'no signature found for {!r}'.format(obj)
2080 raise ValueError(msg) from ex
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002081
2082 if sig is not None:
2083 # For classes and objects we skip the first parameter of their
2084 # __call__, __new__, or __init__ methods
Yury Selivanov57d240e2014-02-19 16:27:23 -05002085 if skip_bound_arg:
2086 return _signature_bound_method(sig)
2087 else:
2088 return sig
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002089
2090 if isinstance(obj, types.BuiltinFunctionType):
2091 # Raise a nicer error message for builtins
2092 msg = 'no signature found for builtin function {!r}'.format(obj)
2093 raise ValueError(msg)
2094
2095 raise ValueError('callable {!r} is not supported by signature'.format(obj))
2096
2097
2098class _void:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002099 """A private marker - used in Parameter & Signature."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002100
2101
2102class _empty:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002103 """Marker object for Signature.empty and Parameter.empty."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002104
2105
Yury Selivanov21e83a52014-03-27 11:23:13 -04002106class _ParameterKind(enum.IntEnum):
2107 POSITIONAL_ONLY = 0
2108 POSITIONAL_OR_KEYWORD = 1
2109 VAR_POSITIONAL = 2
2110 KEYWORD_ONLY = 3
2111 VAR_KEYWORD = 4
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002112
2113 def __str__(self):
Yury Selivanov21e83a52014-03-27 11:23:13 -04002114 return self._name_
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002115
2116
Yury Selivanov21e83a52014-03-27 11:23:13 -04002117_POSITIONAL_ONLY = _ParameterKind.POSITIONAL_ONLY
2118_POSITIONAL_OR_KEYWORD = _ParameterKind.POSITIONAL_OR_KEYWORD
2119_VAR_POSITIONAL = _ParameterKind.VAR_POSITIONAL
2120_KEYWORD_ONLY = _ParameterKind.KEYWORD_ONLY
2121_VAR_KEYWORD = _ParameterKind.VAR_KEYWORD
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002122
2123
2124class Parameter:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002125 """Represents a parameter in a function signature.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002126
2127 Has the following public attributes:
2128
2129 * name : str
2130 The name of the parameter as a string.
2131 * default : object
2132 The default value for the parameter if specified. If the
Yury Selivanov8757ead2014-01-28 16:39:25 -05002133 parameter has no default value, this attribute is set to
2134 `Parameter.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002135 * annotation
2136 The annotation for the parameter if specified. If the
Yury Selivanov8757ead2014-01-28 16:39:25 -05002137 parameter has no annotation, this attribute is set to
2138 `Parameter.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002139 * kind : str
2140 Describes how argument values are bound to the parameter.
2141 Possible values: `Parameter.POSITIONAL_ONLY`,
2142 `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`,
2143 `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002144 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002145
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002146 __slots__ = ('_name', '_kind', '_default', '_annotation')
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002147
2148 POSITIONAL_ONLY = _POSITIONAL_ONLY
2149 POSITIONAL_OR_KEYWORD = _POSITIONAL_OR_KEYWORD
2150 VAR_POSITIONAL = _VAR_POSITIONAL
2151 KEYWORD_ONLY = _KEYWORD_ONLY
2152 VAR_KEYWORD = _VAR_KEYWORD
2153
2154 empty = _empty
2155
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002156 def __init__(self, name, kind, *, default=_empty, annotation=_empty):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002157
2158 if kind not in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD,
2159 _VAR_POSITIONAL, _KEYWORD_ONLY, _VAR_KEYWORD):
2160 raise ValueError("invalid value for 'Parameter.kind' attribute")
2161 self._kind = kind
2162
2163 if default is not _empty:
2164 if kind in (_VAR_POSITIONAL, _VAR_KEYWORD):
2165 msg = '{} parameters cannot have default values'.format(kind)
2166 raise ValueError(msg)
2167 self._default = default
2168 self._annotation = annotation
2169
Yury Selivanov2393dca2014-01-27 15:07:58 -05002170 if name is _empty:
2171 raise ValueError('name is a required attribute for Parameter')
2172
2173 if not isinstance(name, str):
2174 raise TypeError("name must be a str, not a {!r}".format(name))
2175
2176 if not name.isidentifier():
2177 raise ValueError('{!r} is not a valid parameter name'.format(name))
2178
2179 self._name = name
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002180
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002181 def __reduce__(self):
2182 return (type(self),
2183 (self._name, self._kind),
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002184 {'_default': self._default,
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002185 '_annotation': self._annotation})
2186
2187 def __setstate__(self, state):
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002188 self._default = state['_default']
2189 self._annotation = state['_annotation']
2190
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002191 @property
2192 def name(self):
2193 return self._name
2194
2195 @property
2196 def default(self):
2197 return self._default
2198
2199 @property
2200 def annotation(self):
2201 return self._annotation
2202
2203 @property
2204 def kind(self):
2205 return self._kind
2206
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002207 def replace(self, *, name=_void, kind=_void,
2208 annotation=_void, default=_void):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002209 """Creates a customized copy of the Parameter."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002210
2211 if name is _void:
2212 name = self._name
2213
2214 if kind is _void:
2215 kind = self._kind
2216
2217 if annotation is _void:
2218 annotation = self._annotation
2219
2220 if default is _void:
2221 default = self._default
2222
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002223 return type(self)(name, kind, default=default, annotation=annotation)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002224
2225 def __str__(self):
2226 kind = self.kind
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002227 formatted = self._name
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002228
2229 # Add annotation and default value
2230 if self._annotation is not _empty:
2231 formatted = '{}:{}'.format(formatted,
2232 formatannotation(self._annotation))
2233
2234 if self._default is not _empty:
2235 formatted = '{}={}'.format(formatted, repr(self._default))
2236
2237 if kind == _VAR_POSITIONAL:
2238 formatted = '*' + formatted
2239 elif kind == _VAR_KEYWORD:
2240 formatted = '**' + formatted
2241
2242 return formatted
2243
2244 def __repr__(self):
Yury Selivanov374375d2014-03-27 12:41:53 -04002245 return '<{} at {:#x} "{}">'.format(self.__class__.__name__,
2246 id(self), self)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002247
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002248 def __hash__(self):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002249 return hash((self.name, self.kind, self.annotation, self.default))
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002250
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002251 def __eq__(self, other):
2252 return (issubclass(other.__class__, Parameter) and
2253 self._name == other._name and
2254 self._kind == other._kind and
2255 self._default == other._default and
2256 self._annotation == other._annotation)
2257
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002258
2259class BoundArguments:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002260 """Result of `Signature.bind` call. Holds the mapping of arguments
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002261 to the function's parameters.
2262
2263 Has the following public attributes:
2264
2265 * arguments : OrderedDict
2266 An ordered mutable mapping of parameters' names to arguments' values.
2267 Does not contain arguments' default values.
2268 * signature : Signature
2269 The Signature object that created this instance.
2270 * args : tuple
2271 Tuple of positional arguments values.
2272 * kwargs : dict
2273 Dict of keyword arguments values.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002274 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002275
2276 def __init__(self, signature, arguments):
2277 self.arguments = arguments
2278 self._signature = signature
2279
2280 @property
2281 def signature(self):
2282 return self._signature
2283
2284 @property
2285 def args(self):
2286 args = []
2287 for param_name, param in self._signature.parameters.items():
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002288 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002289 break
2290
2291 try:
2292 arg = self.arguments[param_name]
2293 except KeyError:
2294 # We're done here. Other arguments
2295 # will be mapped in 'BoundArguments.kwargs'
2296 break
2297 else:
2298 if param.kind == _VAR_POSITIONAL:
2299 # *args
2300 args.extend(arg)
2301 else:
2302 # plain argument
2303 args.append(arg)
2304
2305 return tuple(args)
2306
2307 @property
2308 def kwargs(self):
2309 kwargs = {}
2310 kwargs_started = False
2311 for param_name, param in self._signature.parameters.items():
2312 if not kwargs_started:
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002313 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002314 kwargs_started = True
2315 else:
2316 if param_name not in self.arguments:
2317 kwargs_started = True
2318 continue
2319
2320 if not kwargs_started:
2321 continue
2322
2323 try:
2324 arg = self.arguments[param_name]
2325 except KeyError:
2326 pass
2327 else:
2328 if param.kind == _VAR_KEYWORD:
2329 # **kwargs
2330 kwargs.update(arg)
2331 else:
2332 # plain keyword argument
2333 kwargs[param_name] = arg
2334
2335 return kwargs
2336
2337 def __eq__(self, other):
2338 return (issubclass(other.__class__, BoundArguments) and
2339 self.signature == other.signature and
2340 self.arguments == other.arguments)
2341
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002342
2343class Signature:
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002344 """A Signature object represents the overall signature of a function.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002345 It stores a Parameter object for each parameter accepted by the
2346 function, as well as information specific to the function itself.
2347
2348 A Signature object has the following public attributes and methods:
2349
2350 * parameters : OrderedDict
2351 An ordered mapping of parameters' names to the corresponding
2352 Parameter objects (keyword-only arguments are in the same order
2353 as listed in `code.co_varnames`).
2354 * return_annotation : object
2355 The annotation for the return type of the function if specified.
2356 If the function has no annotation for its return type, this
Yury Selivanov8757ead2014-01-28 16:39:25 -05002357 attribute is set to `Signature.empty`.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002358 * bind(*args, **kwargs) -> BoundArguments
2359 Creates a mapping from positional and keyword arguments to
2360 parameters.
2361 * bind_partial(*args, **kwargs) -> BoundArguments
2362 Creates a partial mapping from positional and keyword arguments
2363 to parameters (simulating 'functools.partial' behavior.)
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002364 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002365
2366 __slots__ = ('_return_annotation', '_parameters')
2367
2368 _parameter_cls = Parameter
2369 _bound_arguments_cls = BoundArguments
2370
2371 empty = _empty
2372
2373 def __init__(self, parameters=None, *, return_annotation=_empty,
2374 __validate_parameters__=True):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002375 """Constructs Signature from the given list of Parameter
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002376 objects and 'return_annotation'. All arguments are optional.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002377 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002378
2379 if parameters is None:
2380 params = OrderedDict()
2381 else:
2382 if __validate_parameters__:
2383 params = OrderedDict()
2384 top_kind = _POSITIONAL_ONLY
Yury Selivanov07a9e452014-01-29 10:58:16 -05002385 kind_defaults = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002386
2387 for idx, param in enumerate(parameters):
2388 kind = param.kind
Yury Selivanov2393dca2014-01-27 15:07:58 -05002389 name = param.name
2390
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002391 if kind < top_kind:
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002392 msg = 'wrong parameter order: {!r} before {!r}'
Yury Selivanov2393dca2014-01-27 15:07:58 -05002393 msg = msg.format(top_kind, kind)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002394 raise ValueError(msg)
Yury Selivanov07a9e452014-01-29 10:58:16 -05002395 elif kind > top_kind:
2396 kind_defaults = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002397 top_kind = kind
2398
Yury Selivanov3f73ca22014-04-08 11:30:45 -04002399 if kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD):
Yury Selivanov07a9e452014-01-29 10:58:16 -05002400 if param.default is _empty:
2401 if kind_defaults:
2402 # No default for this parameter, but the
2403 # previous parameter of the same kind had
2404 # a default
2405 msg = 'non-default argument follows default ' \
2406 'argument'
2407 raise ValueError(msg)
2408 else:
2409 # There is a default for this parameter.
2410 kind_defaults = True
2411
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002412 if name in params:
2413 msg = 'duplicate parameter name: {!r}'.format(name)
2414 raise ValueError(msg)
Yury Selivanov2393dca2014-01-27 15:07:58 -05002415
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002416 params[name] = param
2417 else:
2418 params = OrderedDict(((param.name, param)
2419 for param in parameters))
2420
2421 self._parameters = types.MappingProxyType(params)
2422 self._return_annotation = return_annotation
2423
2424 @classmethod
2425 def from_function(cls, func):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002426 """Constructs Signature for the given python function."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002427
Yury Selivanov5334bcd2014-01-31 15:21:51 -05002428 is_duck_function = False
2429 if not isfunction(func):
2430 if _signature_is_functionlike(func):
2431 is_duck_function = True
2432 else:
2433 # If it's not a pure Python function, and not a duck type
2434 # of pure function:
2435 raise TypeError('{!r} is not a Python function'.format(func))
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002436
2437 Parameter = cls._parameter_cls
2438
2439 # Parameter information.
2440 func_code = func.__code__
2441 pos_count = func_code.co_argcount
2442 arg_names = func_code.co_varnames
2443 positional = tuple(arg_names[:pos_count])
2444 keyword_only_count = func_code.co_kwonlyargcount
2445 keyword_only = arg_names[pos_count:(pos_count + keyword_only_count)]
2446 annotations = func.__annotations__
2447 defaults = func.__defaults__
2448 kwdefaults = func.__kwdefaults__
2449
2450 if defaults:
2451 pos_default_count = len(defaults)
2452 else:
2453 pos_default_count = 0
2454
2455 parameters = []
2456
2457 # Non-keyword-only parameters w/o defaults.
2458 non_default_count = pos_count - pos_default_count
2459 for name in positional[:non_default_count]:
2460 annotation = annotations.get(name, _empty)
2461 parameters.append(Parameter(name, annotation=annotation,
2462 kind=_POSITIONAL_OR_KEYWORD))
2463
2464 # ... w/ defaults.
2465 for offset, name in enumerate(positional[non_default_count:]):
2466 annotation = annotations.get(name, _empty)
2467 parameters.append(Parameter(name, annotation=annotation,
2468 kind=_POSITIONAL_OR_KEYWORD,
2469 default=defaults[offset]))
2470
2471 # *args
Yury Selivanov89ca85c2014-01-29 16:50:40 -05002472 if func_code.co_flags & CO_VARARGS:
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002473 name = arg_names[pos_count + keyword_only_count]
2474 annotation = annotations.get(name, _empty)
2475 parameters.append(Parameter(name, annotation=annotation,
2476 kind=_VAR_POSITIONAL))
2477
2478 # Keyword-only parameters.
2479 for name in keyword_only:
2480 default = _empty
2481 if kwdefaults is not None:
2482 default = kwdefaults.get(name, _empty)
2483
2484 annotation = annotations.get(name, _empty)
2485 parameters.append(Parameter(name, annotation=annotation,
2486 kind=_KEYWORD_ONLY,
2487 default=default))
2488 # **kwargs
Yury Selivanov89ca85c2014-01-29 16:50:40 -05002489 if func_code.co_flags & CO_VARKEYWORDS:
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002490 index = pos_count + keyword_only_count
Yury Selivanov89ca85c2014-01-29 16:50:40 -05002491 if func_code.co_flags & CO_VARARGS:
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002492 index += 1
2493
2494 name = arg_names[index]
2495 annotation = annotations.get(name, _empty)
2496 parameters.append(Parameter(name, annotation=annotation,
2497 kind=_VAR_KEYWORD))
2498
Yury Selivanov5334bcd2014-01-31 15:21:51 -05002499 # Is 'func' is a pure Python function - don't validate the
2500 # parameters list (for correct order and defaults), it should be OK.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002501 return cls(parameters,
2502 return_annotation=annotations.get('return', _empty),
Yury Selivanov5334bcd2014-01-31 15:21:51 -05002503 __validate_parameters__=is_duck_function)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002504
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002505 @classmethod
2506 def from_builtin(cls, func):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002507 """Constructs Signature for the given builtin function."""
Yury Selivanov57d240e2014-02-19 16:27:23 -05002508 return _signature_from_builtin(cls, func)
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002509
Yury Selivanovda396452014-03-27 12:09:24 -04002510 @classmethod
2511 def from_callable(cls, obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002512 """Constructs Signature for the given callable object."""
2513 return _signature_from_callable(obj, sigcls=cls)
Yury Selivanovda396452014-03-27 12:09:24 -04002514
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002515 @property
2516 def parameters(self):
2517 return self._parameters
2518
2519 @property
2520 def return_annotation(self):
2521 return self._return_annotation
2522
2523 def replace(self, *, parameters=_void, return_annotation=_void):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002524 """Creates a customized copy of the Signature.
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002525 Pass 'parameters' and/or 'return_annotation' arguments
2526 to override them in the new copy.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002527 """
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002528
2529 if parameters is _void:
2530 parameters = self.parameters.values()
2531
2532 if return_annotation is _void:
2533 return_annotation = self._return_annotation
2534
2535 return type(self)(parameters,
2536 return_annotation=return_annotation)
2537
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002538 def _hash_basis(self):
2539 params = tuple(param for param in self.parameters.values()
2540 if param.kind != _KEYWORD_ONLY)
2541
2542 kwo_params = {param.name: param for param in self.parameters.values()
2543 if param.kind == _KEYWORD_ONLY}
2544
2545 return params, kwo_params, self.return_annotation
2546
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002547 def __hash__(self):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002548 params, kwo_params, return_annotation = self._hash_basis()
2549 kwo_params = frozenset(kwo_params.values())
2550 return hash((params, kwo_params, return_annotation))
Yury Selivanov67ae50e2014-04-08 11:46:50 -04002551
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002552 def __eq__(self, other):
Yury Selivanov08d4a4f2014-09-12 15:48:02 -04002553 return (isinstance(other, Signature) and
2554 self._hash_basis() == other._hash_basis())
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002555
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002556 def _bind(self, args, kwargs, *, partial=False):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002557 """Private method. Don't use directly."""
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002558
2559 arguments = OrderedDict()
2560
2561 parameters = iter(self.parameters.values())
2562 parameters_ex = ()
2563 arg_vals = iter(args)
2564
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002565 while True:
2566 # Let's iterate through the positional arguments and corresponding
2567 # parameters
2568 try:
2569 arg_val = next(arg_vals)
2570 except StopIteration:
2571 # No more positional arguments
2572 try:
2573 param = next(parameters)
2574 except StopIteration:
2575 # No more parameters. That's it. Just need to check that
2576 # we have no `kwargs` after this while loop
2577 break
2578 else:
2579 if param.kind == _VAR_POSITIONAL:
2580 # That's OK, just empty *args. Let's start parsing
2581 # kwargs
2582 break
2583 elif param.name in kwargs:
2584 if param.kind == _POSITIONAL_ONLY:
2585 msg = '{arg!r} parameter is positional only, ' \
2586 'but was passed as a keyword'
2587 msg = msg.format(arg=param.name)
2588 raise TypeError(msg) from None
2589 parameters_ex = (param,)
2590 break
2591 elif (param.kind == _VAR_KEYWORD or
2592 param.default is not _empty):
2593 # That's fine too - we have a default value for this
2594 # parameter. So, lets start parsing `kwargs`, starting
2595 # with the current parameter
2596 parameters_ex = (param,)
2597 break
2598 else:
Yury Selivanov38b0d5a2014-01-28 17:27:39 -05002599 # No default, not VAR_KEYWORD, not VAR_POSITIONAL,
2600 # not in `kwargs`
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002601 if partial:
2602 parameters_ex = (param,)
2603 break
2604 else:
2605 msg = '{arg!r} parameter lacking default value'
2606 msg = msg.format(arg=param.name)
2607 raise TypeError(msg) from None
2608 else:
2609 # We have a positional argument to process
2610 try:
2611 param = next(parameters)
2612 except StopIteration:
2613 raise TypeError('too many positional arguments') from None
2614 else:
2615 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
2616 # Looks like we have no parameter for this positional
2617 # argument
2618 raise TypeError('too many positional arguments')
2619
2620 if param.kind == _VAR_POSITIONAL:
2621 # We have an '*args'-like argument, let's fill it with
2622 # all positional arguments we have left and move on to
2623 # the next phase
2624 values = [arg_val]
2625 values.extend(arg_vals)
2626 arguments[param.name] = tuple(values)
2627 break
2628
2629 if param.name in kwargs:
2630 raise TypeError('multiple values for argument '
2631 '{arg!r}'.format(arg=param.name))
2632
2633 arguments[param.name] = arg_val
2634
2635 # Now, we iterate through the remaining parameters to process
2636 # keyword arguments
2637 kwargs_param = None
2638 for param in itertools.chain(parameters_ex, parameters):
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002639 if param.kind == _VAR_KEYWORD:
2640 # Memorize that we have a '**kwargs'-like parameter
2641 kwargs_param = param
2642 continue
2643
Yury Selivanov38b0d5a2014-01-28 17:27:39 -05002644 if param.kind == _VAR_POSITIONAL:
2645 # Named arguments don't refer to '*args'-like parameters.
2646 # We only arrive here if the positional arguments ended
2647 # before reaching the last parameter before *args.
2648 continue
2649
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002650 param_name = param.name
2651 try:
2652 arg_val = kwargs.pop(param_name)
2653 except KeyError:
2654 # We have no value for this parameter. It's fine though,
2655 # if it has a default value, or it is an '*args'-like
2656 # parameter, left alone by the processing of positional
2657 # arguments.
2658 if (not partial and param.kind != _VAR_POSITIONAL and
2659 param.default is _empty):
2660 raise TypeError('{arg!r} parameter lacking default value'. \
2661 format(arg=param_name)) from None
2662
2663 else:
Yury Selivanov9b9ac952014-01-28 20:54:28 -05002664 if param.kind == _POSITIONAL_ONLY:
2665 # This should never happen in case of a properly built
2666 # Signature object (but let's have this check here
2667 # to ensure correct behaviour just in case)
2668 raise TypeError('{arg!r} parameter is positional only, '
2669 'but was passed as a keyword'. \
2670 format(arg=param.name))
2671
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002672 arguments[param_name] = arg_val
2673
2674 if kwargs:
2675 if kwargs_param is not None:
2676 # Process our '**kwargs'-like parameter
2677 arguments[kwargs_param.name] = kwargs
2678 else:
2679 raise TypeError('too many keyword arguments')
2680
2681 return self._bound_arguments_cls(self, arguments)
2682
Yury Selivanovc45873e2014-01-29 12:10:27 -05002683 def bind(*args, **kwargs):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002684 """Get a BoundArguments object, that maps the passed `args`
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002685 and `kwargs` to the function's signature. Raises `TypeError`
2686 if the passed arguments can not be bound.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002687 """
Yury Selivanovc45873e2014-01-29 12:10:27 -05002688 return args[0]._bind(args[1:], kwargs)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002689
Yury Selivanovc45873e2014-01-29 12:10:27 -05002690 def bind_partial(*args, **kwargs):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002691 """Get a BoundArguments object, that partially maps the
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002692 passed `args` and `kwargs` to the function's signature.
2693 Raises `TypeError` if the passed arguments can not be bound.
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002694 """
Yury Selivanovc45873e2014-01-29 12:10:27 -05002695 return args[0]._bind(args[1:], kwargs, partial=True)
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002696
Yury Selivanova5d63dd2014-03-27 11:31:43 -04002697 def __reduce__(self):
2698 return (type(self),
2699 (tuple(self._parameters.values()),),
2700 {'_return_annotation': self._return_annotation})
2701
2702 def __setstate__(self, state):
2703 self._return_annotation = state['_return_annotation']
2704
Yury Selivanov374375d2014-03-27 12:41:53 -04002705 def __repr__(self):
2706 return '<{} at {:#x} "{}">'.format(self.__class__.__name__,
2707 id(self), self)
2708
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002709 def __str__(self):
2710 result = []
Yury Selivanov2393dca2014-01-27 15:07:58 -05002711 render_pos_only_separator = False
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002712 render_kw_only_separator = True
Yury Selivanov2393dca2014-01-27 15:07:58 -05002713 for param in self.parameters.values():
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002714 formatted = str(param)
2715
2716 kind = param.kind
Yury Selivanov2393dca2014-01-27 15:07:58 -05002717
2718 if kind == _POSITIONAL_ONLY:
2719 render_pos_only_separator = True
2720 elif render_pos_only_separator:
2721 # It's not a positional-only parameter, and the flag
2722 # is set to 'True' (there were pos-only params before.)
2723 result.append('/')
2724 render_pos_only_separator = False
2725
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002726 if kind == _VAR_POSITIONAL:
2727 # OK, we have an '*args'-like parameter, so we won't need
2728 # a '*' to separate keyword-only arguments
2729 render_kw_only_separator = False
2730 elif kind == _KEYWORD_ONLY and render_kw_only_separator:
2731 # We have a keyword-only parameter to render and we haven't
2732 # rendered an '*args'-like parameter before, so add a '*'
2733 # separator to the parameters list ("foo(arg1, *, arg2)" case)
2734 result.append('*')
2735 # This condition should be only triggered once, so
2736 # reset the flag
2737 render_kw_only_separator = False
2738
2739 result.append(formatted)
2740
Yury Selivanov2393dca2014-01-27 15:07:58 -05002741 if render_pos_only_separator:
2742 # There were only positional-only parameters, hence the
2743 # flag was not reset to 'False'
2744 result.append('/')
2745
Larry Hastings7c7cbfc2012-06-22 15:19:35 -07002746 rendered = '({})'.format(', '.join(result))
2747
2748 if self.return_annotation is not _empty:
2749 anno = formatannotation(self.return_annotation)
2750 rendered += ' -> {}'.format(anno)
2751
2752 return rendered
Nick Coghlanf94a16b2013-09-22 22:46:49 +10002753
Yury Selivanovda396452014-03-27 12:09:24 -04002754
2755def signature(obj):
Yury Selivanov5a23bd02014-03-29 13:47:11 -04002756 """Get a signature object for the passed callable."""
Yury Selivanovda396452014-03-27 12:09:24 -04002757 return Signature.from_callable(obj)
2758
2759
Nick Coghlanf94a16b2013-09-22 22:46:49 +10002760def _main():
2761 """ Logic for inspecting an object given at command line """
2762 import argparse
2763 import importlib
2764
2765 parser = argparse.ArgumentParser()
2766 parser.add_argument(
2767 'object',
2768 help="The object to be analysed. "
2769 "It supports the 'module:qualname' syntax")
2770 parser.add_argument(
2771 '-d', '--details', action='store_true',
2772 help='Display info about the module rather than its source code')
2773
2774 args = parser.parse_args()
2775
2776 target = args.object
2777 mod_name, has_attrs, attrs = target.partition(":")
2778 try:
2779 obj = module = importlib.import_module(mod_name)
2780 except Exception as exc:
2781 msg = "Failed to import {} ({}: {})".format(mod_name,
2782 type(exc).__name__,
2783 exc)
2784 print(msg, file=sys.stderr)
2785 exit(2)
2786
2787 if has_attrs:
2788 parts = attrs.split(".")
2789 obj = module
2790 for part in parts:
2791 obj = getattr(obj, part)
2792
2793 if module.__name__ in sys.builtin_module_names:
2794 print("Can't get info for builtin modules.", file=sys.stderr)
2795 exit(1)
2796
2797 if args.details:
2798 print('Target: {}'.format(target))
2799 print('Origin: {}'.format(getsourcefile(module)))
2800 print('Cached: {}'.format(module.__cached__))
2801 if obj is module:
2802 print('Loader: {}'.format(repr(module.__loader__)))
2803 if hasattr(module, '__path__'):
2804 print('Submodule search path: {}'.format(module.__path__))
2805 else:
2806 try:
2807 __, lineno = findsource(obj)
2808 except Exception:
2809 pass
2810 else:
2811 print('Line: {}'.format(lineno))
2812
2813 print('\n')
2814 else:
2815 print(getsource(obj))
2816
2817
2818if __name__ == "__main__":
2819 _main()