1"""Get useful information from live Python objects. 2 3This module encapsulates the interface provided by the internal special 4attributes (co_*, im_*, tb_*, etc.) in a friendlier fashion. 5It also provides some help for examining source code and class layout. 6 7Here are some of the useful functions provided by this module: 8 9 ismodule(), isclass(), ismethod(), isfunction(), isgeneratorfunction(), 10 isgenerator(), istraceback(), isframe(), iscode(), isbuiltin(), 11 isroutine() - check object types 12 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 19 getargvalues(), getcallargs() - get info about function arguments 20 getfullargspec() - same, with support for Python 3 features 21 formatargvalues() - format an argument spec 22 getouterframes(), getinnerframes() - get info about frames 23 currentframe() - get the current stack frame 24 stack(), trace() - get info about frames on the stack or in a traceback 25 26 signature() - get a Signature object for the callable 27 28 get_annotations() - safely compute an object's annotations 29""" 30 31# This module is in the public domain. No warranties. 32 33__author__ = ('Ka-Ping Yee <ping@lfw.org>', 34 'Yury Selivanov <yselivanov@sprymix.com>') 35 36import abc 37import ast 38import dis 39import collections.abc 40import enum 41import importlib.machinery 42import itertools 43import linecache 44import os 45import re 46import sys 47import tokenize 48import token 49import types 50import warnings 51import functools 52import builtins 53from operator import attrgetter 54from collections import namedtuple, OrderedDict 55 56# Create constants for the compiler flags in Include/code.h 57# We try to get them from dis to avoid duplication 58mod_dict = globals() 59for k, v in dis.COMPILER_FLAG_NAMES.items(): 60 mod_dict["CO_" + v] = k 61 62# See Include/object.h 63TPFLAGS_IS_ABSTRACT = 1 << 20 64 65 66def get_annotations(obj, *, globals=None, locals=None, eval_str=False): 67 """Compute the annotations dict for an object. 68 69 obj may be a callable, class, or module. 70 Passing in an object of any other type raises TypeError. 71 72 Returns a dict. get_annotations() returns a new dict every time 73 it's called; calling it twice on the same object will return two 74 different but equivalent dicts. 75 76 This function handles several details for you: 77 78 * If eval_str is true, values of type str will 79 be un-stringized using eval(). This is intended 80 for use with stringized annotations 81 ("from __future__ import annotations"). 82 * If obj doesn't have an annotations dict, returns an 83 empty dict. (Functions and methods always have an 84 annotations dict; classes, modules, and other types of 85 callables may not.) 86 * Ignores inherited annotations on classes. If a class 87 doesn't have its own annotations dict, returns an empty dict. 88 * All accesses to object members and dict values are done 89 using getattr() and dict.get() for safety. 90 * Always, always, always returns a freshly-created dict. 91 92 eval_str controls whether or not values of type str are replaced 93 with the result of calling eval() on those values: 94 95 * If eval_str is true, eval() is called on values of type str. 96 * If eval_str is false (the default), values of type str are unchanged. 97 98 globals and locals are passed in to eval(); see the documentation 99 for eval() for more information. If either globals or locals is 100 None, this function may replace that value with a context-specific 101 default, contingent on type(obj): 102 103 * If obj is a module, globals defaults to obj.__dict__. 104 * If obj is a class, globals defaults to 105 sys.modules[obj.__module__].__dict__ and locals 106 defaults to the obj class namespace. 107 * If obj is a callable, globals defaults to obj.__globals__, 108 although if obj is a wrapped function (using 109 functools.update_wrapper()) it is first unwrapped. 110 """ 111 if isinstance(obj, type): 112 # class 113 obj_dict = getattr(obj, '__dict__', None) 114 if obj_dict and hasattr(obj_dict, 'get'): 115 ann = obj_dict.get('__annotations__', None) 116 if isinstance(ann, types.GetSetDescriptorType): 117 ann = None 118 else: 119 ann = None 120 121 obj_globals = None 122 module_name = getattr(obj, '__module__', None) 123 if module_name: 124 module = sys.modules.get(module_name, None) 125 if module: 126 obj_globals = getattr(module, '__dict__', None) 127 obj_locals = dict(vars(obj)) 128 unwrap = obj 129 elif isinstance(obj, types.ModuleType): 130 # module 131 ann = getattr(obj, '__annotations__', None) 132 obj_globals = getattr(obj, '__dict__') 133 obj_locals = None 134 unwrap = None 135 elif callable(obj): 136 # this includes types.Function, types.BuiltinFunctionType, 137 # types.BuiltinMethodType, functools.partial, functools.singledispatch, 138 # "class funclike" from Lib/test/test_inspect... on and on it goes. 139 ann = getattr(obj, '__annotations__', None) 140 obj_globals = getattr(obj, '__globals__', None) 141 obj_locals = None 142 unwrap = obj 143 else: 144 raise TypeError(f"{obj!r} is not a module, class, or callable.") 145 146 if ann is None: 147 return {} 148 149 if not isinstance(ann, dict): 150 raise ValueError(f"{obj!r}.__annotations__ is neither a dict nor None") 151 152 if not ann: 153 return {} 154 155 if not eval_str: 156 return dict(ann) 157 158 if unwrap is not None: 159 while True: 160 if hasattr(unwrap, '__wrapped__'): 161 unwrap = unwrap.__wrapped__ 162 continue 163 if isinstance(unwrap, functools.partial): 164 unwrap = unwrap.func 165 continue 166 break 167 if hasattr(unwrap, "__globals__"): 168 obj_globals = unwrap.__globals__ 169 170 if globals is None: 171 globals = obj_globals 172 if locals is None: 173 locals = obj_locals 174 175 return_value = {key: 176 value if not isinstance(value, str) else eval(value, globals, locals) 177 for key, value in ann.items() } 178 return return_value 179 180 181# ----------------------------------------------------------- type-checking 182def ismodule(object): 183 """Return true if the object is a module. 184 185 Module objects provide these attributes: 186 __cached__ pathname to byte compiled file 187 __doc__ documentation string 188 __file__ filename (missing for built-in modules)""" 189 return isinstance(object, types.ModuleType) 190 191def isclass(object): 192 """Return true if the object is a class. 193 194 Class objects provide these attributes: 195 __doc__ documentation string 196 __module__ name of module in which this class was defined""" 197 return isinstance(object, type) 198 199def ismethod(object): 200 """Return true if the object is an instance method. 201 202 Instance method objects provide these attributes: 203 __doc__ documentation string 204 __name__ name with which this method was defined 205 __func__ function object containing implementation of method 206 __self__ instance to which this method is bound""" 207 return isinstance(object, types.MethodType) 208 209def ismethoddescriptor(object): 210 """Return true if the object is a method descriptor. 211 212 But not if ismethod() or isclass() or isfunction() are true. 213 214 This is new in Python 2.2, and, for example, is true of int.__add__. 215 An object passing this test has a __get__ attribute but not a __set__ 216 attribute, but beyond that the set of attributes varies. __name__ is 217 usually sensible, and __doc__ often is. 218 219 Methods implemented via descriptors that also pass one of the other 220 tests return false from the ismethoddescriptor() test, simply because 221 the other tests promise more -- you can, e.g., count on having the 222 __func__ attribute (etc) when an object passes ismethod().""" 223 if isclass(object) or ismethod(object) or isfunction(object): 224 # mutual exclusion 225 return False 226 tp = type(object) 227 return hasattr(tp, "__get__") and not hasattr(tp, "__set__") 228 229def isdatadescriptor(object): 230 """Return true if the object is a data descriptor. 231 232 Data descriptors have a __set__ or a __delete__ attribute. Examples are 233 properties (defined in Python) and getsets and members (defined in C). 234 Typically, data descriptors will also have __name__ and __doc__ attributes 235 (properties, getsets, and members have both of these attributes), but this 236 is not guaranteed.""" 237 if isclass(object) or ismethod(object) or isfunction(object): 238 # mutual exclusion 239 return False 240 tp = type(object) 241 return hasattr(tp, "__set__") or hasattr(tp, "__delete__") 242 243if hasattr(types, 'MemberDescriptorType'): 244 # CPython and equivalent 245 def ismemberdescriptor(object): 246 """Return true if the object is a member descriptor. 247 248 Member descriptors are specialized descriptors defined in extension 249 modules.""" 250 return isinstance(object, types.MemberDescriptorType) 251else: 252 # Other implementations 253 def ismemberdescriptor(object): 254 """Return true if the object is a member descriptor. 255 256 Member descriptors are specialized descriptors defined in extension 257 modules.""" 258 return False 259 260if hasattr(types, 'GetSetDescriptorType'): 261 # CPython and equivalent 262 def isgetsetdescriptor(object): 263 """Return true if the object is a getset descriptor. 264 265 getset descriptors are specialized descriptors defined in extension 266 modules.""" 267 return isinstance(object, types.GetSetDescriptorType) 268else: 269 # Other implementations 270 def isgetsetdescriptor(object): 271 """Return true if the object is a getset descriptor. 272 273 getset descriptors are specialized descriptors defined in extension 274 modules.""" 275 return False 276 277def isfunction(object): 278 """Return true if the object is a user-defined function. 279 280 Function objects provide these attributes: 281 __doc__ documentation string 282 __name__ name with which this function was defined 283 __code__ code object containing compiled function bytecode 284 __defaults__ tuple of any default values for arguments 285 __globals__ global namespace in which this function was defined 286 __annotations__ dict of parameter annotations 287 __kwdefaults__ dict of keyword only parameters with defaults""" 288 return isinstance(object, types.FunctionType) 289 290def _has_code_flag(f, flag): 291 """Return true if ``f`` is a function (or a method or functools.partial 292 wrapper wrapping a function) whose code object has the given ``flag`` 293 set in its flags.""" 294 while ismethod(f): 295 f = f.__func__ 296 f = functools._unwrap_partial(f) 297 if not isfunction(f): 298 return False 299 return bool(f.__code__.co_flags & flag) 300 301def isgeneratorfunction(obj): 302 """Return true if the object is a user-defined generator function. 303 304 Generator function objects provide the same attributes as functions. 305 See help(isfunction) for a list of attributes.""" 306 return _has_code_flag(obj, CO_GENERATOR) 307 308def iscoroutinefunction(obj): 309 """Return true if the object is a coroutine function. 310 311 Coroutine functions are defined with "async def" syntax. 312 """ 313 return _has_code_flag(obj, CO_COROUTINE) 314 315def isasyncgenfunction(obj): 316 """Return true if the object is an asynchronous generator function. 317 318 Asynchronous generator functions are defined with "async def" 319 syntax and have "yield" expressions in their body. 320 """ 321 return _has_code_flag(obj, CO_ASYNC_GENERATOR) 322 323def isasyncgen(object): 324 """Return true if the object is an asynchronous generator.""" 325 return isinstance(object, types.AsyncGeneratorType) 326 327def isgenerator(object): 328 """Return true if the object is a generator. 329 330 Generator objects provide these attributes: 331 __iter__ defined to support iteration over container 332 close raises a new GeneratorExit exception inside the 333 generator to terminate the iteration 334 gi_code code object 335 gi_frame frame object or possibly None once the generator has 336 been exhausted 337 gi_running set to 1 when generator is executing, 0 otherwise 338 next return the next item from the container 339 send resumes the generator and "sends" a value that becomes 340 the result of the current yield-expression 341 throw used to raise an exception inside the generator""" 342 return isinstance(object, types.GeneratorType) 343 344def iscoroutine(object): 345 """Return true if the object is a coroutine.""" 346 return isinstance(object, types.CoroutineType) 347 348def isawaitable(object): 349 """Return true if object can be passed to an ``await`` expression.""" 350 return (isinstance(object, types.CoroutineType) or 351 isinstance(object, types.GeneratorType) and 352 bool(object.gi_code.co_flags & CO_ITERABLE_COROUTINE) or 353 isinstance(object, collections.abc.Awaitable)) 354 355def istraceback(object): 356 """Return true if the object is a traceback. 357 358 Traceback objects provide these attributes: 359 tb_frame frame object at this level 360 tb_lasti index of last attempted instruction in bytecode 361 tb_lineno current line number in Python source code 362 tb_next next inner traceback object (called by this level)""" 363 return isinstance(object, types.TracebackType) 364 365def isframe(object): 366 """Return true if the object is a frame object. 367 368 Frame objects provide these attributes: 369 f_back next outer frame object (this frame's caller) 370 f_builtins built-in namespace seen by this frame 371 f_code code object being executed in this frame 372 f_globals global namespace seen by this frame 373 f_lasti index of last attempted instruction in bytecode 374 f_lineno current line number in Python source code 375 f_locals local namespace seen by this frame 376 f_trace tracing function for this frame, or None""" 377 return isinstance(object, types.FrameType) 378 379def iscode(object): 380 """Return true if the object is a code object. 381 382 Code objects provide these attributes: 383 co_argcount number of arguments (not including *, ** args 384 or keyword only arguments) 385 co_code string of raw compiled bytecode 386 co_cellvars tuple of names of cell variables 387 co_consts tuple of constants used in the bytecode 388 co_filename name of file in which this code object was created 389 co_firstlineno number of first line in Python source code 390 co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg 391 | 16=nested | 32=generator | 64=nofree | 128=coroutine 392 | 256=iterable_coroutine | 512=async_generator 393 co_freevars tuple of names of free variables 394 co_posonlyargcount number of positional only arguments 395 co_kwonlyargcount number of keyword only arguments (not including ** arg) 396 co_lnotab encoded mapping of line numbers to bytecode indices 397 co_name name with which this code object was defined 398 co_names tuple of names other than arguments and function locals 399 co_nlocals number of local variables 400 co_stacksize virtual machine stack space required 401 co_varnames tuple of names of arguments and local variables""" 402 return isinstance(object, types.CodeType) 403 404def isbuiltin(object): 405 """Return true if the object is a built-in function or method. 406 407 Built-in functions and methods provide these attributes: 408 __doc__ documentation string 409 __name__ original name of this function or method 410 __self__ instance to which a method is bound, or None""" 411 return isinstance(object, types.BuiltinFunctionType) 412 413def isroutine(object): 414 """Return true if the object is any kind of function or method.""" 415 return (isbuiltin(object) 416 or isfunction(object) 417 or ismethod(object) 418 or ismethoddescriptor(object)) 419 420def isabstract(object): 421 """Return true if the object is an abstract base class (ABC).""" 422 if not isinstance(object, type): 423 return False 424 if object.__flags__ & TPFLAGS_IS_ABSTRACT: 425 return True 426 if not issubclass(type(object), abc.ABCMeta): 427 return False 428 if hasattr(object, '__abstractmethods__'): 429 # It looks like ABCMeta.__new__ has finished running; 430 # TPFLAGS_IS_ABSTRACT should have been accurate. 431 return False 432 # It looks like ABCMeta.__new__ has not finished running yet; we're 433 # probably in __init_subclass__. We'll look for abstractmethods manually. 434 for name, value in object.__dict__.items(): 435 if getattr(value, "__isabstractmethod__", False): 436 return True 437 for base in object.__bases__: 438 for name in getattr(base, "__abstractmethods__", ()): 439 value = getattr(object, name, None) 440 if getattr(value, "__isabstractmethod__", False): 441 return True 442 return False 443 444def getmembers(object, predicate=None): 445 """Return all members of an object as (name, value) pairs sorted by name. 446 Optionally, only return members that satisfy a given predicate.""" 447 if isclass(object): 448 mro = (object,) + getmro(object) 449 else: 450 mro = () 451 results = [] 452 processed = set() 453 names = dir(object) 454 # :dd any DynamicClassAttributes to the list of names if object is a class; 455 # this may result in duplicate entries if, for example, a virtual 456 # attribute with the same name as a DynamicClassAttribute exists 457 try: 458 for base in object.__bases__: 459 for k, v in base.__dict__.items(): 460 if isinstance(v, types.DynamicClassAttribute): 461 names.append(k) 462 except AttributeError: 463 pass 464 for key in names: 465 # First try to get the value via getattr. Some descriptors don't 466 # like calling their __get__ (see bug #1785), so fall back to 467 # looking in the __dict__. 468 try: 469 value = getattr(object, key) 470 # handle the duplicate key 471 if key in processed: 472 raise AttributeError 473 except AttributeError: 474 for base in mro: 475 if key in base.__dict__: 476 value = base.__dict__[key] 477 break 478 else: 479 # could be a (currently) missing slot member, or a buggy 480 # __dir__; discard and move on 481 continue 482 if not predicate or predicate(value): 483 results.append((key, value)) 484 processed.add(key) 485 results.sort(key=lambda pair: pair[0]) 486 return results 487 488Attribute = namedtuple('Attribute', 'name kind defining_class object') 489 490def classify_class_attrs(cls): 491 """Return list of attribute-descriptor tuples. 492 493 For each name in dir(cls), the return list contains a 4-tuple 494 with these elements: 495 496 0. The name (a string). 497 498 1. The kind of attribute this is, one of these strings: 499 'class method' created via classmethod() 500 'static method' created via staticmethod() 501 'property' created via property() 502 'method' any other flavor of method or descriptor 503 'data' not a method 504 505 2. The class which defined this attribute (a class). 506 507 3. The object as obtained by calling getattr; if this fails, or if the 508 resulting object does not live anywhere in the class' mro (including 509 metaclasses) then the object is looked up in the defining class's 510 dict (found by walking the mro). 511 512 If one of the items in dir(cls) is stored in the metaclass it will now 513 be discovered and not have None be listed as the class in which it was 514 defined. Any items whose home class cannot be discovered are skipped. 515 """ 516 517 mro = getmro(cls) 518 metamro = getmro(type(cls)) # for attributes stored in the metaclass 519 metamro = tuple(cls for cls in metamro if cls not in (type, object)) 520 class_bases = (cls,) + mro 521 all_bases = class_bases + metamro 522 names = dir(cls) 523 # :dd any DynamicClassAttributes to the list of names; 524 # this may result in duplicate entries if, for example, a virtual 525 # attribute with the same name as a DynamicClassAttribute exists. 526 for base in mro: 527 for k, v in base.__dict__.items(): 528 if isinstance(v, types.DynamicClassAttribute) and v.fget is not None: 529 names.append(k) 530 result = [] 531 processed = set() 532 533 for name in names: 534 # Get the object associated with the name, and where it was defined. 535 # Normal objects will be looked up with both getattr and directly in 536 # its class' dict (in case getattr fails [bug #1785], and also to look 537 # for a docstring). 538 # For DynamicClassAttributes on the second pass we only look in the 539 # class's dict. 540 # 541 # Getting an obj from the __dict__ sometimes reveals more than 542 # using getattr. Static and class methods are dramatic examples. 543 homecls = None 544 get_obj = None 545 dict_obj = None 546 if name not in processed: 547 try: 548 if name == '__dict__': 549 raise Exception("__dict__ is special, don't want the proxy") 550 get_obj = getattr(cls, name) 551 except Exception as exc: 552 pass 553 else: 554 homecls = getattr(get_obj, "__objclass__", homecls) 555 if homecls not in class_bases: 556 # if the resulting object does not live somewhere in the 557 # mro, drop it and search the mro manually 558 homecls = None 559 last_cls = None 560 # first look in the classes 561 for srch_cls in class_bases: 562 srch_obj = getattr(srch_cls, name, None) 563 if srch_obj is get_obj: 564 last_cls = srch_cls 565 # then check the metaclasses 566 for srch_cls in metamro: 567 try: 568 srch_obj = srch_cls.__getattr__(cls, name) 569 except AttributeError: 570 continue 571 if srch_obj is get_obj: 572 last_cls = srch_cls 573 if last_cls is not None: 574 homecls = last_cls 575 for base in all_bases: 576 if name in base.__dict__: 577 dict_obj = base.__dict__[name] 578 if homecls not in metamro: 579 homecls = base 580 break 581 if homecls is None: 582 # unable to locate the attribute anywhere, most likely due to 583 # buggy custom __dir__; discard and move on 584 continue 585 obj = get_obj if get_obj is not None else dict_obj 586 # Classify the object or its descriptor. 587 if isinstance(dict_obj, (staticmethod, types.BuiltinMethodType)): 588 kind = "static method" 589 obj = dict_obj 590 elif isinstance(dict_obj, (classmethod, types.ClassMethodDescriptorType)): 591 kind = "class method" 592 obj = dict_obj 593 elif isinstance(dict_obj, property): 594 kind = "property" 595 obj = dict_obj 596 elif isroutine(obj): 597 kind = "method" 598 else: 599 kind = "data" 600 result.append(Attribute(name, kind, homecls, obj)) 601 processed.add(name) 602 return result 603 604# ----------------------------------------------------------- class helpers 605 606def getmro(cls): 607 "Return tuple of base classes (including cls) in method resolution order." 608 return cls.__mro__ 609 610# -------------------------------------------------------- function helpers 611 612def unwrap(func, *, stop=None): 613 """Get the object wrapped by *func*. 614 615 Follows the chain of :attr:`__wrapped__` attributes returning the last 616 object in the chain. 617 618 *stop* is an optional callback accepting an object in the wrapper chain 619 as its sole argument that allows the unwrapping to be terminated early if 620 the callback returns a true value. If the callback never returns a true 621 value, the last object in the chain is returned as usual. For example, 622 :func:`signature` uses this to stop unwrapping if any object in the 623 chain has a ``__signature__`` attribute defined. 624 625 :exc:`ValueError` is raised if a cycle is encountered. 626 627 """ 628 if stop is None: 629 def _is_wrapper(f): 630 return hasattr(f, '__wrapped__') 631 else: 632 def _is_wrapper(f): 633 return hasattr(f, '__wrapped__') and not stop(f) 634 f = func # remember the original func for error reporting 635 # Memoise by id to tolerate non-hashable objects, but store objects to 636 # ensure they aren't destroyed, which would allow their IDs to be reused. 637 memo = {id(f): f} 638 recursion_limit = sys.getrecursionlimit() 639 while _is_wrapper(func): 640 func = func.__wrapped__ 641 id_func = id(func) 642 if (id_func in memo) or (len(memo) >= recursion_limit): 643 raise ValueError('wrapper loop when unwrapping {!r}'.format(f)) 644 memo[id_func] = func 645 return func 646 647# -------------------------------------------------- source code extraction 648def indentsize(line): 649 """Return the indent size, in spaces, at the start of a line of text.""" 650 expline = line.expandtabs() 651 return len(expline) - len(expline.lstrip()) 652 653def _findclass(func): 654 cls = sys.modules.get(func.__module__) 655 if cls is None: 656 return None 657 for name in func.__qualname__.split('.')[:-1]: 658 cls = getattr(cls, name) 659 if not isclass(cls): 660 return None 661 return cls 662 663def _finddoc(obj): 664 if isclass(obj): 665 for base in obj.__mro__: 666 if base is not object: 667 try: 668 doc = base.__doc__ 669 except AttributeError: 670 continue 671 if doc is not None: 672 return doc 673 return None 674 675 if ismethod(obj): 676 name = obj.__func__.__name__ 677 self = obj.__self__ 678 if (isclass(self) and 679 getattr(getattr(self, name, None), '__func__') is obj.__func__): 680 # classmethod 681 cls = self 682 else: 683 cls = self.__class__ 684 elif isfunction(obj): 685 name = obj.__name__ 686 cls = _findclass(obj) 687 if cls is None or getattr(cls, name) is not obj: 688 return None 689 elif isbuiltin(obj): 690 name = obj.__name__ 691 self = obj.__self__ 692 if (isclass(self) and 693 self.__qualname__ + '.' + name == obj.__qualname__): 694 # classmethod 695 cls = self 696 else: 697 cls = self.__class__ 698 # Should be tested before isdatadescriptor(). 699 elif isinstance(obj, property): 700 func = obj.fget 701 name = func.__name__ 702 cls = _findclass(func) 703 if cls is None or getattr(cls, name) is not obj: 704 return None 705 elif ismethoddescriptor(obj) or isdatadescriptor(obj): 706 name = obj.__name__ 707 cls = obj.__objclass__ 708 if getattr(cls, name) is not obj: 709 return None 710 if ismemberdescriptor(obj): 711 slots = getattr(cls, '__slots__', None) 712 if isinstance(slots, dict) and name in slots: 713 return slots[name] 714 else: 715 return None 716 for base in cls.__mro__: 717 try: 718 doc = getattr(base, name).__doc__ 719 except AttributeError: 720 continue 721 if doc is not None: 722 return doc 723 return None 724 725def getdoc(object): 726 """Get the documentation string for an object. 727 728 All tabs are expanded to spaces. To clean up docstrings that are 729 indented to line up with blocks of code, any whitespace than can be 730 uniformly removed from the second line onwards is removed.""" 731 try: 732 doc = object.__doc__ 733 except AttributeError: 734 return None 735 if doc is None: 736 try: 737 doc = _finddoc(object) 738 except (AttributeError, TypeError): 739 return None 740 if not isinstance(doc, str): 741 return None 742 return cleandoc(doc) 743 744def cleandoc(doc): 745 """Clean up indentation from docstrings. 746 747 Any whitespace that can be uniformly removed from the second line 748 onwards is removed.""" 749 try: 750 lines = doc.expandtabs().split('\n') 751 except UnicodeError: 752 return None 753 else: 754 # Find minimum indentation of any non-blank lines after first line. 755 margin = sys.maxsize 756 for line in lines[1:]: 757 content = len(line.lstrip()) 758 if content: 759 indent = len(line) - content 760 margin = min(margin, indent) 761 # Remove indentation. 762 if lines: 763 lines[0] = lines[0].lstrip() 764 if margin < sys.maxsize: 765 for i in range(1, len(lines)): lines[i] = lines[i][margin:] 766 # Remove any trailing or leading blank lines. 767 while lines and not lines[-1]: 768 lines.pop() 769 while lines and not lines[0]: 770 lines.pop(0) 771 return '\n'.join(lines) 772 773def getfile(object): 774 """Work out which source or compiled file an object was defined in.""" 775 if ismodule(object): 776 if getattr(object, '__file__', None): 777 return object.__file__ 778 raise TypeError('{!r} is a built-in module'.format(object)) 779 if isclass(object): 780 if hasattr(object, '__module__'): 781 module = sys.modules.get(object.__module__) 782 if getattr(module, '__file__', None): 783 return module.__file__ 784 if object.__module__ == '__main__': 785 raise OSError('source code not available') 786 raise TypeError('{!r} is a built-in class'.format(object)) 787 if ismethod(object): 788 object = object.__func__ 789 if isfunction(object): 790 object = object.__code__ 791 if istraceback(object): 792 object = object.tb_frame 793 if isframe(object): 794 object = object.f_code 795 if iscode(object): 796 return object.co_filename 797 raise TypeError('module, class, method, function, traceback, frame, or ' 798 'code object was expected, got {}'.format( 799 type(object).__name__)) 800 801def getmodulename(path): 802 """Return the module name for a given file, or None.""" 803 fname = os.path.basename(path) 804 # Check for paths that look like an actual module file 805 suffixes = [(-len(suffix), suffix) 806 for suffix in importlib.machinery.all_suffixes()] 807 suffixes.sort() # try longest suffixes first, in case they overlap 808 for neglen, suffix in suffixes: 809 if fname.endswith(suffix): 810 return fname[:neglen] 811 return None 812 813def getsourcefile(object): 814 """Return the filename that can be used to locate an object's source. 815 Return None if no way can be identified to get the source. 816 """ 817 filename = getfile(object) 818 all_bytecode_suffixes = importlib.machinery.DEBUG_BYTECODE_SUFFIXES[:] 819 all_bytecode_suffixes += importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES[:] 820 if any(filename.endswith(s) for s in all_bytecode_suffixes): 821 filename = (os.path.splitext(filename)[0] + 822 importlib.machinery.SOURCE_SUFFIXES[0]) 823 elif any(filename.endswith(s) for s in 824 importlib.machinery.EXTENSION_SUFFIXES): 825 return None 826 if os.path.exists(filename): 827 return filename 828 # only return a non-existent filename if the module has a PEP 302 loader 829 module = getmodule(object, filename) 830 if getattr(module, '__loader__', None) is not None: 831 return filename 832 elif getattr(getattr(module, "__spec__", None), "loader", None) is not None: 833 return filename 834 # or it is in the linecache 835 elif filename in linecache.cache: 836 return filename 837 838def getabsfile(object, _filename=None): 839 """Return an absolute path to the source or compiled file for an object. 840 841 The idea is for each object to have a unique origin, so this routine 842 normalizes the result as much as possible.""" 843 if _filename is None: 844 _filename = getsourcefile(object) or getfile(object) 845 return os.path.normcase(os.path.abspath(_filename)) 846 847modulesbyfile = {} 848_filesbymodname = {} 849 850def getmodule(object, _filename=None): 851 """Return the module an object was defined in, or None if not found.""" 852 if ismodule(object): 853 return object 854 if hasattr(object, '__module__'): 855 return sys.modules.get(object.__module__) 856 # Try the filename to modulename cache 857 if _filename is not None and _filename in modulesbyfile: 858 return sys.modules.get(modulesbyfile[_filename]) 859 # Try the cache again with the absolute file name 860 try: 861 file = getabsfile(object, _filename) 862 except (TypeError, FileNotFoundError): 863 return None 864 if file in modulesbyfile: 865 return sys.modules.get(modulesbyfile[file]) 866 # Update the filename to module name cache and check yet again 867 # Copy sys.modules in order to cope with changes while iterating 868 for modname, module in sys.modules.copy().items(): 869 if ismodule(module) and hasattr(module, '__file__'): 870 f = module.__file__ 871 if f == _filesbymodname.get(modname, None): 872 # Have already mapped this module, so skip it 873 continue 874 _filesbymodname[modname] = f 875 f = getabsfile(module) 876 # Always map to the name the module knows itself by 877 modulesbyfile[f] = modulesbyfile[ 878 os.path.realpath(f)] = module.__name__ 879 if file in modulesbyfile: 880 return sys.modules.get(modulesbyfile[file]) 881 # Check the main module 882 main = sys.modules['__main__'] 883 if not hasattr(object, '__name__'): 884 return None 885 if hasattr(main, object.__name__): 886 mainobject = getattr(main, object.__name__) 887 if mainobject is object: 888 return main 889 # Check builtins 890 builtin = sys.modules['builtins'] 891 if hasattr(builtin, object.__name__): 892 builtinobject = getattr(builtin, object.__name__) 893 if builtinobject is object: 894 return builtin 895 896 897class ClassFoundException(Exception): 898 pass 899 900 901class _ClassFinder(ast.NodeVisitor): 902 903 def __init__(self, qualname): 904 self.stack = [] 905 self.qualname = qualname 906 907 def visit_FunctionDef(self, node): 908 self.stack.append(node.name) 909 self.stack.append('<locals>') 910 self.generic_visit(node) 911 self.stack.pop() 912 self.stack.pop() 913 914 visit_AsyncFunctionDef = visit_FunctionDef 915 916 def visit_ClassDef(self, node): 917 self.stack.append(node.name) 918 if self.qualname == '.'.join(self.stack): 919 # Return the decorator for the class if present 920 if node.decorator_list: 921 line_number = node.decorator_list[0].lineno 922 else: 923 line_number = node.lineno 924 925 # decrement by one since lines starts with indexing by zero 926 line_number -= 1 927 raise ClassFoundException(line_number) 928 self.generic_visit(node) 929 self.stack.pop() 930 931 932def findsource(object): 933 """Return the entire source file and starting line number for an object. 934 935 The argument may be a module, class, method, function, traceback, frame, 936 or code object. The source code is returned as a list of all the lines 937 in the file and the line number indexes a line in that list. An OSError 938 is raised if the source code cannot be retrieved.""" 939 940 file = getsourcefile(object) 941 if file: 942 # Invalidate cache if needed. 943 linecache.checkcache(file) 944 else: 945 file = getfile(object) 946 # Allow filenames in form of "<something>" to pass through. 947 # `doctest` monkeypatches `linecache` module to enable 948 # inspection, so let `linecache.getlines` to be called. 949 if not (file.startswith('<') and file.endswith('>')): 950 raise OSError('source code not available') 951 952 module = getmodule(object, file) 953 if module: 954 lines = linecache.getlines(file, module.__dict__) 955 else: 956 lines = linecache.getlines(file) 957 if not lines: 958 raise OSError('could not get source code') 959 960 if ismodule(object): 961 return lines, 0 962 963 if isclass(object): 964 qualname = object.__qualname__ 965 source = ''.join(lines) 966 tree = ast.parse(source) 967 class_finder = _ClassFinder(qualname) 968 try: 969 class_finder.visit(tree) 970 except ClassFoundException as e: 971 line_number = e.args[0] 972 return lines, line_number 973 else: 974 raise OSError('could not find class definition') 975 976 if ismethod(object): 977 object = object.__func__ 978 if isfunction(object): 979 object = object.__code__ 980 if istraceback(object): 981 object = object.tb_frame 982 if isframe(object): 983 object = object.f_code 984 if iscode(object): 985 if not hasattr(object, 'co_firstlineno'): 986 raise OSError('could not find function definition') 987 lnum = object.co_firstlineno - 1 988 pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)') 989 while lnum > 0: 990 try: 991 line = lines[lnum] 992 except IndexError: 993 raise OSError('lineno is out of bounds') 994 if pat.match(line): 995 break 996 lnum = lnum - 1 997 return lines, lnum 998 raise OSError('could not find code object') 999 1000def getcomments(object): 1001 """Get lines of comments immediately preceding an object's source code. 1002 1003 Returns None when source can't be found. 1004 """ 1005 try: 1006 lines, lnum = findsource(object) 1007 except (OSError, TypeError): 1008 return None 1009 1010 if ismodule(object): 1011 # Look for a comment block at the top of the file. 1012 start = 0 1013 if lines and lines[0][:2] == '#!': start = 1 1014 while start < len(lines) and lines[start].strip() in ('', '#'): 1015 start = start + 1 1016 if start < len(lines) and lines[start][:1] == '#': 1017 comments = [] 1018 end = start 1019 while end < len(lines) and lines[end][:1] == '#': 1020 comments.append(lines[end].expandtabs()) 1021 end = end + 1 1022 return ''.join(comments) 1023 1024 # Look for a preceding block of comments at the same indentation. 1025 elif lnum > 0: 1026 indent = indentsize(lines[lnum]) 1027 end = lnum - 1 1028 if end >= 0 and lines[end].lstrip()[:1] == '#' and \ 1029 indentsize(lines[end]) == indent: 1030 comments = [lines[end].expandtabs().lstrip()] 1031 if end > 0: 1032 end = end - 1 1033 comment = lines[end].expandtabs().lstrip() 1034 while comment[:1] == '#' and indentsize(lines[end]) == indent: 1035 comments[:0] = [comment] 1036 end = end - 1 1037 if end < 0: break 1038 comment = lines[end].expandtabs().lstrip() 1039 while comments and comments[0].strip() == '#': 1040 comments[:1] = [] 1041 while comments and comments[-1].strip() == '#': 1042 comments[-1:] = [] 1043 return ''.join(comments) 1044 1045class EndOfBlock(Exception): pass 1046 1047class BlockFinder: 1048 """Provide a tokeneater() method to detect the end of a code block.""" 1049 def __init__(self): 1050 self.indent = 0 1051 self.islambda = False 1052 self.started = False 1053 self.passline = False 1054 self.indecorator = False 1055 self.decoratorhasargs = False 1056 self.last = 1 1057 self.body_col0 = None 1058 1059 def tokeneater(self, type, token, srowcol, erowcol, line): 1060 if not self.started and not self.indecorator: 1061 # skip any decorators 1062 if token == "@": 1063 self.indecorator = True 1064 # look for the first "def", "class" or "lambda" 1065 elif token in ("def", "class", "lambda"): 1066 if token == "lambda": 1067 self.islambda = True 1068 self.started = True 1069 self.passline = True # skip to the end of the line 1070 elif token == "(": 1071 if self.indecorator: 1072 self.decoratorhasargs = True 1073 elif token == ")": 1074 if self.indecorator: 1075 self.indecorator = False 1076 self.decoratorhasargs = False 1077 elif type == tokenize.NEWLINE: 1078 self.passline = False # stop skipping when a NEWLINE is seen 1079 self.last = srowcol[0] 1080 if self.islambda: # lambdas always end at the first NEWLINE 1081 raise EndOfBlock 1082 # hitting a NEWLINE when in a decorator without args 1083 # ends the decorator 1084 if self.indecorator and not self.decoratorhasargs: 1085 self.indecorator = False 1086 elif self.passline: 1087 pass 1088 elif type == tokenize.INDENT: 1089 if self.body_col0 is None and self.started: 1090 self.body_col0 = erowcol[1] 1091 self.indent = self.indent + 1 1092 self.passline = True 1093 elif type == tokenize.DEDENT: 1094 self.indent = self.indent - 1 1095 # the end of matching indent/dedent pairs end a block 1096 # (note that this only works for "def"/"class" blocks, 1097 # not e.g. for "if: else:" or "try: finally:" blocks) 1098 if self.indent <= 0: 1099 raise EndOfBlock 1100 elif type == tokenize.COMMENT: 1101 if self.body_col0 is not None and srowcol[1] >= self.body_col0: 1102 # Include comments if indented at least as much as the block 1103 self.last = srowcol[0] 1104 elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL): 1105 # any other token on the same indentation level end the previous 1106 # block as well, except the pseudo-tokens COMMENT and NL. 1107 raise EndOfBlock 1108 1109def getblock(lines): 1110 """Extract the block of code at the top of the given list of lines.""" 1111 blockfinder = BlockFinder() 1112 try: 1113 tokens = tokenize.generate_tokens(iter(lines).__next__) 1114 for _token in tokens: 1115 blockfinder.tokeneater(*_token) 1116 except (EndOfBlock, IndentationError): 1117 pass 1118 return lines[:blockfinder.last] 1119 1120def getsourcelines(object): 1121 """Return a list of source lines and starting line number for an object. 1122 1123 The argument may be a module, class, method, function, traceback, frame, 1124 or code object. The source code is returned as a list of the lines 1125 corresponding to the object and the line number indicates where in the 1126 original source file the first line of code was found. An OSError is 1127 raised if the source code cannot be retrieved.""" 1128 object = unwrap(object) 1129 lines, lnum = findsource(object) 1130 1131 if istraceback(object): 1132 object = object.tb_frame 1133 1134 # for module or frame that corresponds to module, return all source lines 1135 if (ismodule(object) or 1136 (isframe(object) and object.f_code.co_name == "<module>")): 1137 return lines, 0 1138 else: 1139 return getblock(lines[lnum:]), lnum + 1 1140 1141def getsource(object): 1142 """Return the text of the source code for an object. 1143 1144 The argument may be a module, class, method, function, traceback, frame, 1145 or code object. The source code is returned as a single string. An 1146 OSError is raised if the source code cannot be retrieved.""" 1147 lines, lnum = getsourcelines(object) 1148 return ''.join(lines) 1149 1150# --------------------------------------------------- class tree extraction 1151def walktree(classes, children, parent): 1152 """Recursive helper function for getclasstree().""" 1153 results = [] 1154 classes.sort(key=attrgetter('__module__', '__name__')) 1155 for c in classes: 1156 results.append((c, c.__bases__)) 1157 if c in children: 1158 results.append(walktree(children[c], children, c)) 1159 return results 1160 1161def getclasstree(classes, unique=False): 1162 """Arrange the given list of classes into a hierarchy of nested lists. 1163 1164 Where a nested list appears, it contains classes derived from the class 1165 whose entry immediately precedes the list. Each entry is a 2-tuple 1166 containing a class and a tuple of its base classes. If the 'unique' 1167 argument is true, exactly one entry appears in the returned structure 1168 for each class in the given list. Otherwise, classes using multiple 1169 inheritance and their descendants will appear multiple times.""" 1170 children = {} 1171 roots = [] 1172 for c in classes: 1173 if c.__bases__: 1174 for parent in c.__bases__: 1175 if parent not in children: 1176 children[parent] = [] 1177 if c not in children[parent]: 1178 children[parent].append(c) 1179 if unique and parent in classes: break 1180 elif c not in roots: 1181 roots.append(c) 1182 for parent in children: 1183 if parent not in classes: 1184 roots.append(parent) 1185 return walktree(roots, children, None) 1186 1187# ------------------------------------------------ argument list extraction 1188Arguments = namedtuple('Arguments', 'args, varargs, varkw') 1189 1190def getargs(co): 1191 """Get information about the arguments accepted by a code object. 1192 1193 Three things are returned: (args, varargs, varkw), where 1194 'args' is the list of argument names. Keyword-only arguments are 1195 appended. 'varargs' and 'varkw' are the names of the * and ** 1196 arguments or None.""" 1197 if not iscode(co): 1198 raise TypeError('{!r} is not a code object'.format(co)) 1199 1200 names = co.co_varnames 1201 nargs = co.co_argcount 1202 nkwargs = co.co_kwonlyargcount 1203 args = list(names[:nargs]) 1204 kwonlyargs = list(names[nargs:nargs+nkwargs]) 1205 step = 0 1206 1207 nargs += nkwargs 1208 varargs = None 1209 if co.co_flags & CO_VARARGS: 1210 varargs = co.co_varnames[nargs] 1211 nargs = nargs + 1 1212 varkw = None 1213 if co.co_flags & CO_VARKEYWORDS: 1214 varkw = co.co_varnames[nargs] 1215 return Arguments(args + kwonlyargs, varargs, varkw) 1216 1217ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults') 1218 1219def getargspec(func): 1220 """Get the names and default values of a function's parameters. 1221 1222 A tuple of four things is returned: (args, varargs, keywords, defaults). 1223 'args' is a list of the argument names, including keyword-only argument names. 1224 'varargs' and 'keywords' are the names of the * and ** parameters or None. 1225 'defaults' is an n-tuple of the default values of the last n parameters. 1226 1227 This function is deprecated, as it does not support annotations or 1228 keyword-only parameters and will raise ValueError if either is present 1229 on the supplied callable. 1230 1231 For a more structured introspection API, use inspect.signature() instead. 1232 1233 Alternatively, use getfullargspec() for an API with a similar namedtuple 1234 based interface, but full support for annotations and keyword-only 1235 parameters. 1236 1237 Deprecated since Python 3.5, use `inspect.getfullargspec()`. 1238 """ 1239 warnings.warn("inspect.getargspec() is deprecated since Python 3.0, " 1240 "use inspect.signature() or inspect.getfullargspec()", 1241 DeprecationWarning, stacklevel=2) 1242 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \ 1243 getfullargspec(func) 1244 if kwonlyargs or ann: 1245 raise ValueError("Function has keyword-only parameters or annotations" 1246 ", use inspect.signature() API which can support them") 1247 return ArgSpec(args, varargs, varkw, defaults) 1248 1249FullArgSpec = namedtuple('FullArgSpec', 1250 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations') 1251 1252def getfullargspec(func): 1253 """Get the names and default values of a callable object's parameters. 1254 1255 A tuple of seven things is returned: 1256 (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations). 1257 'args' is a list of the parameter names. 1258 'varargs' and 'varkw' are the names of the * and ** parameters or None. 1259 'defaults' is an n-tuple of the default values of the last n parameters. 1260 'kwonlyargs' is a list of keyword-only parameter names. 1261 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults. 1262 'annotations' is a dictionary mapping parameter names to annotations. 1263 1264 Notable differences from inspect.signature(): 1265 - the "self" parameter is always reported, even for bound methods 1266 - wrapper chains defined by __wrapped__ *not* unwrapped automatically 1267 """ 1268 try: 1269 # Re: `skip_bound_arg=False` 1270 # 1271 # There is a notable difference in behaviour between getfullargspec 1272 # and Signature: the former always returns 'self' parameter for bound 1273 # methods, whereas the Signature always shows the actual calling 1274 # signature of the passed object. 1275 # 1276 # To simulate this behaviour, we "unbind" bound methods, to trick 1277 # inspect.signature to always return their first parameter ("self", 1278 # usually) 1279 1280 # Re: `follow_wrapper_chains=False` 1281 # 1282 # getfullargspec() historically ignored __wrapped__ attributes, 1283 # so we ensure that remains the case in 3.3+ 1284 1285 sig = _signature_from_callable(func, 1286 follow_wrapper_chains=False, 1287 skip_bound_arg=False, 1288 sigcls=Signature, 1289 eval_str=False) 1290 except Exception as ex: 1291 # Most of the times 'signature' will raise ValueError. 1292 # But, it can also raise AttributeError, and, maybe something 1293 # else. So to be fully backwards compatible, we catch all 1294 # possible exceptions here, and reraise a TypeError. 1295 raise TypeError('unsupported callable') from ex 1296 1297 args = [] 1298 varargs = None 1299 varkw = None 1300 posonlyargs = [] 1301 kwonlyargs = [] 1302 annotations = {} 1303 defaults = () 1304 kwdefaults = {} 1305 1306 if sig.return_annotation is not sig.empty: 1307 annotations['return'] = sig.return_annotation 1308 1309 for param in sig.parameters.values(): 1310 kind = param.kind 1311 name = param.name 1312 1313 if kind is _POSITIONAL_ONLY: 1314 posonlyargs.append(name) 1315 if param.default is not param.empty: 1316 defaults += (param.default,) 1317 elif kind is _POSITIONAL_OR_KEYWORD: 1318 args.append(name) 1319 if param.default is not param.empty: 1320 defaults += (param.default,) 1321 elif kind is _VAR_POSITIONAL: 1322 varargs = name 1323 elif kind is _KEYWORD_ONLY: 1324 kwonlyargs.append(name) 1325 if param.default is not param.empty: 1326 kwdefaults[name] = param.default 1327 elif kind is _VAR_KEYWORD: 1328 varkw = name 1329 1330 if param.annotation is not param.empty: 1331 annotations[name] = param.annotation 1332 1333 if not kwdefaults: 1334 # compatibility with 'func.__kwdefaults__' 1335 kwdefaults = None 1336 1337 if not defaults: 1338 # compatibility with 'func.__defaults__' 1339 defaults = None 1340 1341 return FullArgSpec(posonlyargs + args, varargs, varkw, defaults, 1342 kwonlyargs, kwdefaults, annotations) 1343 1344 1345ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals') 1346 1347def getargvalues(frame): 1348 """Get information about arguments passed into a particular frame. 1349 1350 A tuple of four things is returned: (args, varargs, varkw, locals). 1351 'args' is a list of the argument names. 1352 'varargs' and 'varkw' are the names of the * and ** arguments or None. 1353 'locals' is the locals dictionary of the given frame.""" 1354 args, varargs, varkw = getargs(frame.f_code) 1355 return ArgInfo(args, varargs, varkw, frame.f_locals) 1356 1357def formatannotation(annotation, base_module=None): 1358 if getattr(annotation, '__module__', None) == 'typing': 1359 return repr(annotation).replace('typing.', '') 1360 if isinstance(annotation, types.GenericAlias): 1361 return str(annotation) 1362 if isinstance(annotation, type): 1363 if annotation.__module__ in ('builtins', base_module): 1364 return annotation.__qualname__ 1365 return annotation.__module__+'.'+annotation.__qualname__ 1366 return repr(annotation) 1367 1368def formatannotationrelativeto(object): 1369 module = getattr(object, '__module__', None) 1370 def _formatannotation(annotation): 1371 return formatannotation(annotation, module) 1372 return _formatannotation 1373 1374def formatargspec(args, varargs=None, varkw=None, defaults=None, 1375 kwonlyargs=(), kwonlydefaults={}, annotations={}, 1376 formatarg=str, 1377 formatvarargs=lambda name: '*' + name, 1378 formatvarkw=lambda name: '**' + name, 1379 formatvalue=lambda value: '=' + repr(value), 1380 formatreturns=lambda text: ' -> ' + text, 1381 formatannotation=formatannotation): 1382 """Format an argument spec from the values returned by getfullargspec. 1383 1384 The first seven arguments are (args, varargs, varkw, defaults, 1385 kwonlyargs, kwonlydefaults, annotations). The other five arguments 1386 are the corresponding optional formatting functions that are called to 1387 turn names and values into strings. The last argument is an optional 1388 function to format the sequence of arguments. 1389 1390 Deprecated since Python 3.5: use the `signature` function and `Signature` 1391 objects. 1392 """ 1393 1394 from warnings import warn 1395 1396 warn("`formatargspec` is deprecated since Python 3.5. Use `signature` and " 1397 "the `Signature` object directly", 1398 DeprecationWarning, 1399 stacklevel=2) 1400 1401 def formatargandannotation(arg): 1402 result = formatarg(arg) 1403 if arg in annotations: 1404 result += ': ' + formatannotation(annotations[arg]) 1405 return result 1406 specs = [] 1407 if defaults: 1408 firstdefault = len(args) - len(defaults) 1409 for i, arg in enumerate(args): 1410 spec = formatargandannotation(arg) 1411 if defaults and i >= firstdefault: 1412 spec = spec + formatvalue(defaults[i - firstdefault]) 1413 specs.append(spec) 1414 if varargs is not None: 1415 specs.append(formatvarargs(formatargandannotation(varargs))) 1416 else: 1417 if kwonlyargs: 1418 specs.append('*') 1419 if kwonlyargs: 1420 for kwonlyarg in kwonlyargs: 1421 spec = formatargandannotation(kwonlyarg) 1422 if kwonlydefaults and kwonlyarg in kwonlydefaults: 1423 spec += formatvalue(kwonlydefaults[kwonlyarg]) 1424 specs.append(spec) 1425 if varkw is not None: 1426 specs.append(formatvarkw(formatargandannotation(varkw))) 1427 result = '(' + ', '.join(specs) + ')' 1428 if 'return' in annotations: 1429 result += formatreturns(formatannotation(annotations['return'])) 1430 return result 1431 1432def formatargvalues(args, varargs, varkw, locals, 1433 formatarg=str, 1434 formatvarargs=lambda name: '*' + name, 1435 formatvarkw=lambda name: '**' + name, 1436 formatvalue=lambda value: '=' + repr(value)): 1437 """Format an argument spec from the 4 values returned by getargvalues. 1438 1439 The first four arguments are (args, varargs, varkw, locals). The 1440 next four arguments are the corresponding optional formatting functions 1441 that are called to turn names and values into strings. The ninth 1442 argument is an optional function to format the sequence of arguments.""" 1443 def convert(name, locals=locals, 1444 formatarg=formatarg, formatvalue=formatvalue): 1445 return formatarg(name) + formatvalue(locals[name]) 1446 specs = [] 1447 for i in range(len(args)): 1448 specs.append(convert(args[i])) 1449 if varargs: 1450 specs.append(formatvarargs(varargs) + formatvalue(locals[varargs])) 1451 if varkw: 1452 specs.append(formatvarkw(varkw) + formatvalue(locals[varkw])) 1453 return '(' + ', '.join(specs) + ')' 1454 1455def _missing_arguments(f_name, argnames, pos, values): 1456 names = [repr(name) for name in argnames if name not in values] 1457 missing = len(names) 1458 if missing == 1: 1459 s = names[0] 1460 elif missing == 2: 1461 s = "{} and {}".format(*names) 1462 else: 1463 tail = ", {} and {}".format(*names[-2:]) 1464 del names[-2:] 1465 s = ", ".join(names) + tail 1466 raise TypeError("%s() missing %i required %s argument%s: %s" % 1467 (f_name, missing, 1468 "positional" if pos else "keyword-only", 1469 "" if missing == 1 else "s", s)) 1470 1471def _too_many(f_name, args, kwonly, varargs, defcount, given, values): 1472 atleast = len(args) - defcount 1473 kwonly_given = len([arg for arg in kwonly if arg in values]) 1474 if varargs: 1475 plural = atleast != 1 1476 sig = "at least %d" % (atleast,) 1477 elif defcount: 1478 plural = True 1479 sig = "from %d to %d" % (atleast, len(args)) 1480 else: 1481 plural = len(args) != 1 1482 sig = str(len(args)) 1483 kwonly_sig = "" 1484 if kwonly_given: 1485 msg = " positional argument%s (and %d keyword-only argument%s)" 1486 kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given, 1487 "s" if kwonly_given != 1 else "")) 1488 raise TypeError("%s() takes %s positional argument%s but %d%s %s given" % 1489 (f_name, sig, "s" if plural else "", given, kwonly_sig, 1490 "was" if given == 1 and not kwonly_given else "were")) 1491 1492def getcallargs(func, /, *positional, **named): 1493 """Get the mapping of arguments to values. 1494 1495 A dict is returned, with keys the function argument names (including the 1496 names of the * and ** arguments, if any), and values the respective bound 1497 values from 'positional' and 'named'.""" 1498 spec = getfullargspec(func) 1499 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec 1500 f_name = func.__name__ 1501 arg2value = {} 1502 1503 1504 if ismethod(func) and func.__self__ is not None: 1505 # implicit 'self' (or 'cls' for classmethods) argument 1506 positional = (func.__self__,) + positional 1507 num_pos = len(positional) 1508 num_args = len(args) 1509 num_defaults = len(defaults) if defaults else 0 1510 1511 n = min(num_pos, num_args) 1512 for i in range(n): 1513 arg2value[args[i]] = positional[i] 1514 if varargs: 1515 arg2value[varargs] = tuple(positional[n:]) 1516 possible_kwargs = set(args + kwonlyargs) 1517 if varkw: 1518 arg2value[varkw] = {} 1519 for kw, value in named.items(): 1520 if kw not in possible_kwargs: 1521 if not varkw: 1522 raise TypeError("%s() got an unexpected keyword argument %r" % 1523 (f_name, kw)) 1524 arg2value[varkw][kw] = value 1525 continue 1526 if kw in arg2value: 1527 raise TypeError("%s() got multiple values for argument %r" % 1528 (f_name, kw)) 1529 arg2value[kw] = value 1530 if num_pos > num_args and not varargs: 1531 _too_many(f_name, args, kwonlyargs, varargs, num_defaults, 1532 num_pos, arg2value) 1533 if num_pos < num_args: 1534 req = args[:num_args - num_defaults] 1535 for arg in req: 1536 if arg not in arg2value: 1537 _missing_arguments(f_name, req, True, arg2value) 1538 for i, arg in enumerate(args[num_args - num_defaults:]): 1539 if arg not in arg2value: 1540 arg2value[arg] = defaults[i] 1541 missing = 0 1542 for kwarg in kwonlyargs: 1543 if kwarg not in arg2value: 1544 if kwonlydefaults and kwarg in kwonlydefaults: 1545 arg2value[kwarg] = kwonlydefaults[kwarg] 1546 else: 1547 missing += 1 1548 if missing: 1549 _missing_arguments(f_name, kwonlyargs, False, arg2value) 1550 return arg2value 1551 1552ClosureVars = namedtuple('ClosureVars', 'nonlocals globals builtins unbound') 1553 1554def getclosurevars(func): 1555 """ 1556 Get the mapping of free variables to their current values. 1557 1558 Returns a named tuple of dicts mapping the current nonlocal, global 1559 and builtin references as seen by the body of the function. A final 1560 set of unbound names that could not be resolved is also provided. 1561 """ 1562 1563 if ismethod(func): 1564 func = func.__func__ 1565 1566 if not isfunction(func): 1567 raise TypeError("{!r} is not a Python function".format(func)) 1568 1569 code = func.__code__ 1570 # Nonlocal references are named in co_freevars and resolved 1571 # by looking them up in __closure__ by positional index 1572 if func.__closure__ is None: 1573 nonlocal_vars = {} 1574 else: 1575 nonlocal_vars = { 1576 var : cell.cell_contents 1577 for var, cell in zip(code.co_freevars, func.__closure__) 1578 } 1579 1580 # Global and builtin references are named in co_names and resolved 1581 # by looking them up in __globals__ or __builtins__ 1582 global_ns = func.__globals__ 1583 builtin_ns = global_ns.get("__builtins__", builtins.__dict__) 1584 if ismodule(builtin_ns): 1585 builtin_ns = builtin_ns.__dict__ 1586 global_vars = {} 1587 builtin_vars = {} 1588 unbound_names = set() 1589 for name in code.co_names: 1590 if name in ("None", "True", "False"): 1591 # Because these used to be builtins instead of keywords, they 1592 # may still show up as name references. We ignore them. 1593 continue 1594 try: 1595 global_vars[name] = global_ns[name] 1596 except KeyError: 1597 try: 1598 builtin_vars[name] = builtin_ns[name] 1599 except KeyError: 1600 unbound_names.add(name) 1601 1602 return ClosureVars(nonlocal_vars, global_vars, 1603 builtin_vars, unbound_names) 1604 1605# -------------------------------------------------- stack frame extraction 1606 1607Traceback = namedtuple('Traceback', 'filename lineno function code_context index') 1608 1609def getframeinfo(frame, context=1): 1610 """Get information about a frame or traceback object. 1611 1612 A tuple of five things is returned: the filename, the line number of 1613 the current line, the function name, a list of lines of context from 1614 the source code, and the index of the current line within that list. 1615 The optional second argument specifies the number of lines of context 1616 to return, which are centered around the current line.""" 1617 if istraceback(frame): 1618 lineno = frame.tb_lineno 1619 frame = frame.tb_frame 1620 else: 1621 lineno = frame.f_lineno 1622 if not isframe(frame): 1623 raise TypeError('{!r} is not a frame or traceback object'.format(frame)) 1624 1625 filename = getsourcefile(frame) or getfile(frame) 1626 if context > 0: 1627 start = lineno - 1 - context//2 1628 try: 1629 lines, lnum = findsource(frame) 1630 except OSError: 1631 lines = index = None 1632 else: 1633 start = max(0, min(start, len(lines) - context)) 1634 lines = lines[start:start+context] 1635 index = lineno - 1 - start 1636 else: 1637 lines = index = None 1638 1639 return Traceback(filename, lineno, frame.f_code.co_name, lines, index) 1640 1641def getlineno(frame): 1642 """Get the line number from a frame object, allowing for optimization.""" 1643 # FrameType.f_lineno is now a descriptor that grovels co_lnotab 1644 return frame.f_lineno 1645 1646FrameInfo = namedtuple('FrameInfo', ('frame',) + Traceback._fields) 1647 1648def getouterframes(frame, context=1): 1649 """Get a list of records for a frame and all higher (calling) frames. 1650 1651 Each record contains a frame object, filename, line number, function 1652 name, a list of lines of context, and index within the context.""" 1653 framelist = [] 1654 while frame: 1655 frameinfo = (frame,) + getframeinfo(frame, context) 1656 framelist.append(FrameInfo(*frameinfo)) 1657 frame = frame.f_back 1658 return framelist 1659 1660def getinnerframes(tb, context=1): 1661 """Get a list of records for a traceback's frame and all lower frames. 1662 1663 Each record contains a frame object, filename, line number, function 1664 name, a list of lines of context, and index within the context.""" 1665 framelist = [] 1666 while tb: 1667 frameinfo = (tb.tb_frame,) + getframeinfo(tb, context) 1668 framelist.append(FrameInfo(*frameinfo)) 1669 tb = tb.tb_next 1670 return framelist 1671 1672def currentframe(): 1673 """Return the frame of the caller or None if this is not possible.""" 1674 return sys._getframe(1) if hasattr(sys, "_getframe") else None 1675 1676def stack(context=1): 1677 """Return a list of records for the stack above the caller's frame.""" 1678 return getouterframes(sys._getframe(1), context) 1679 1680def trace(context=1): 1681 """Return a list of records for the stack below the current exception.""" 1682 return getinnerframes(sys.exc_info()[2], context) 1683 1684 1685# ------------------------------------------------ static version of getattr 1686 1687_sentinel = object() 1688 1689def _static_getmro(klass): 1690 return type.__dict__['__mro__'].__get__(klass) 1691 1692def _check_instance(obj, attr): 1693 instance_dict = {} 1694 try: 1695 instance_dict = object.__getattribute__(obj, "__dict__") 1696 except AttributeError: 1697 pass 1698 return dict.get(instance_dict, attr, _sentinel) 1699 1700 1701def _check_class(klass, attr): 1702 for entry in _static_getmro(klass): 1703 if _shadowed_dict(type(entry)) is _sentinel: 1704 try: 1705 return entry.__dict__[attr] 1706 except KeyError: 1707 pass 1708 return _sentinel 1709 1710def _is_type(obj): 1711 try: 1712 _static_getmro(obj) 1713 except TypeError: 1714 return False 1715 return True 1716 1717def _shadowed_dict(klass): 1718 dict_attr = type.__dict__["__dict__"] 1719 for entry in _static_getmro(klass): 1720 try: 1721 class_dict = dict_attr.__get__(entry)["__dict__"] 1722 except KeyError: 1723 pass 1724 else: 1725 if not (type(class_dict) is types.GetSetDescriptorType and 1726 class_dict.__name__ == "__dict__" and 1727 class_dict.__objclass__ is entry): 1728 return class_dict 1729 return _sentinel 1730 1731def getattr_static(obj, attr, default=_sentinel): 1732 """Retrieve attributes without triggering dynamic lookup via the 1733 descriptor protocol, __getattr__ or __getattribute__. 1734 1735 Note: this function may not be able to retrieve all attributes 1736 that getattr can fetch (like dynamically created attributes) 1737 and may find attributes that getattr can't (like descriptors 1738 that raise AttributeError). It can also return descriptor objects 1739 instead of instance members in some cases. See the 1740 documentation for details. 1741 """ 1742 instance_result = _sentinel 1743 if not _is_type(obj): 1744 klass = type(obj) 1745 dict_attr = _shadowed_dict(klass) 1746 if (dict_attr is _sentinel or 1747 type(dict_attr) is types.MemberDescriptorType): 1748 instance_result = _check_instance(obj, attr) 1749 else: 1750 klass = obj 1751 1752 klass_result = _check_class(klass, attr) 1753 1754 if instance_result is not _sentinel and klass_result is not _sentinel: 1755 if (_check_class(type(klass_result), '__get__') is not _sentinel and 1756 _check_class(type(klass_result), '__set__') is not _sentinel): 1757 return klass_result 1758 1759 if instance_result is not _sentinel: 1760 return instance_result 1761 if klass_result is not _sentinel: 1762 return klass_result 1763 1764 if obj is klass: 1765 # for types we check the metaclass too 1766 for entry in _static_getmro(type(klass)): 1767 if _shadowed_dict(type(entry)) is _sentinel: 1768 try: 1769 return entry.__dict__[attr] 1770 except KeyError: 1771 pass 1772 if default is not _sentinel: 1773 return default 1774 raise AttributeError(attr) 1775 1776 1777# ------------------------------------------------ generator introspection 1778 1779GEN_CREATED = 'GEN_CREATED' 1780GEN_RUNNING = 'GEN_RUNNING' 1781GEN_SUSPENDED = 'GEN_SUSPENDED' 1782GEN_CLOSED = 'GEN_CLOSED' 1783 1784def getgeneratorstate(generator): 1785 """Get current state of a generator-iterator. 1786 1787 Possible states are: 1788 GEN_CREATED: Waiting to start execution. 1789 GEN_RUNNING: Currently being executed by the interpreter. 1790 GEN_SUSPENDED: Currently suspended at a yield expression. 1791 GEN_CLOSED: Execution has completed. 1792 """ 1793 if generator.gi_running: 1794 return GEN_RUNNING 1795 if generator.gi_frame is None: 1796 return GEN_CLOSED 1797 if generator.gi_frame.f_lasti == -1: 1798 return GEN_CREATED 1799 return GEN_SUSPENDED 1800 1801 1802def getgeneratorlocals(generator): 1803 """ 1804 Get the mapping of generator local variables to their current values. 1805 1806 A dict is returned, with the keys the local variable names and values the 1807 bound values.""" 1808 1809 if not isgenerator(generator): 1810 raise TypeError("{!r} is not a Python generator".format(generator)) 1811 1812 frame = getattr(generator, "gi_frame", None) 1813 if frame is not None: 1814 return generator.gi_frame.f_locals 1815 else: 1816 return {} 1817 1818 1819# ------------------------------------------------ coroutine introspection 1820 1821CORO_CREATED = 'CORO_CREATED' 1822CORO_RUNNING = 'CORO_RUNNING' 1823CORO_SUSPENDED = 'CORO_SUSPENDED' 1824CORO_CLOSED = 'CORO_CLOSED' 1825 1826def getcoroutinestate(coroutine): 1827 """Get current state of a coroutine object. 1828 1829 Possible states are: 1830 CORO_CREATED: Waiting to start execution. 1831 CORO_RUNNING: Currently being executed by the interpreter. 1832 CORO_SUSPENDED: Currently suspended at an await expression. 1833 CORO_CLOSED: Execution has completed. 1834 """ 1835 if coroutine.cr_running: 1836 return CORO_RUNNING 1837 if coroutine.cr_frame is None: 1838 return CORO_CLOSED 1839 if coroutine.cr_frame.f_lasti == -1: 1840 return CORO_CREATED 1841 return CORO_SUSPENDED 1842 1843 1844def getcoroutinelocals(coroutine): 1845 """ 1846 Get the mapping of coroutine local variables to their current values. 1847 1848 A dict is returned, with the keys the local variable names and values the 1849 bound values.""" 1850 frame = getattr(coroutine, "cr_frame", None) 1851 if frame is not None: 1852 return frame.f_locals 1853 else: 1854 return {} 1855 1856 1857############################################################################### 1858### Function Signature Object (PEP 362) 1859############################################################################### 1860 1861 1862_WrapperDescriptor = type(type.__call__) 1863_MethodWrapper = type(all.__call__) 1864_ClassMethodWrapper = type(int.__dict__['from_bytes']) 1865 1866_NonUserDefinedCallables = (_WrapperDescriptor, 1867 _MethodWrapper, 1868 _ClassMethodWrapper, 1869 types.BuiltinFunctionType) 1870 1871 1872def _signature_get_user_defined_method(cls, method_name): 1873 """Private helper. Checks if ``cls`` has an attribute 1874 named ``method_name`` and returns it only if it is a 1875 pure python function. 1876 """ 1877 try: 1878 meth = getattr(cls, method_name) 1879 except AttributeError: 1880 return 1881 else: 1882 if not isinstance(meth, _NonUserDefinedCallables): 1883 # Once '__signature__' will be added to 'C'-level 1884 # callables, this check won't be necessary 1885 return meth 1886 1887 1888def _signature_get_partial(wrapped_sig, partial, extra_args=()): 1889 """Private helper to calculate how 'wrapped_sig' signature will 1890 look like after applying a 'functools.partial' object (or alike) 1891 on it. 1892 """ 1893 1894 old_params = wrapped_sig.parameters 1895 new_params = OrderedDict(old_params.items()) 1896 1897 partial_args = partial.args or () 1898 partial_keywords = partial.keywords or {} 1899 1900 if extra_args: 1901 partial_args = extra_args + partial_args 1902 1903 try: 1904 ba = wrapped_sig.bind_partial(*partial_args, **partial_keywords) 1905 except TypeError as ex: 1906 msg = 'partial object {!r} has incorrect arguments'.format(partial) 1907 raise ValueError(msg) from ex 1908 1909 1910 transform_to_kwonly = False 1911 for param_name, param in old_params.items(): 1912 try: 1913 arg_value = ba.arguments[param_name] 1914 except KeyError: 1915 pass 1916 else: 1917 if param.kind is _POSITIONAL_ONLY: 1918 # If positional-only parameter is bound by partial, 1919 # it effectively disappears from the signature 1920 new_params.pop(param_name) 1921 continue 1922 1923 if param.kind is _POSITIONAL_OR_KEYWORD: 1924 if param_name in partial_keywords: 1925 # This means that this parameter, and all parameters 1926 # after it should be keyword-only (and var-positional 1927 # should be removed). Here's why. Consider the following 1928 # function: 1929 # foo(a, b, *args, c): 1930 # pass 1931 # 1932 # "partial(foo, a='spam')" will have the following 1933 # signature: "(*, a='spam', b, c)". Because attempting 1934 # to call that partial with "(10, 20)" arguments will 1935 # raise a TypeError, saying that "a" argument received 1936 # multiple values. 1937 transform_to_kwonly = True 1938 # Set the new default value 1939 new_params[param_name] = param.replace(default=arg_value) 1940 else: 1941 # was passed as a positional argument 1942 new_params.pop(param.name) 1943 continue 1944 1945 if param.kind is _KEYWORD_ONLY: 1946 # Set the new default value 1947 new_params[param_name] = param.replace(default=arg_value) 1948 1949 if transform_to_kwonly: 1950 assert param.kind is not _POSITIONAL_ONLY 1951 1952 if param.kind is _POSITIONAL_OR_KEYWORD: 1953 new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY) 1954 new_params[param_name] = new_param 1955 new_params.move_to_end(param_name) 1956 elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD): 1957 new_params.move_to_end(param_name) 1958 elif param.kind is _VAR_POSITIONAL: 1959 new_params.pop(param.name) 1960 1961 return wrapped_sig.replace(parameters=new_params.values()) 1962 1963 1964def _signature_bound_method(sig): 1965 """Private helper to transform signatures for unbound 1966 functions to bound methods. 1967 """ 1968 1969 params = tuple(sig.parameters.values()) 1970 1971 if not params or params[0].kind in (_VAR_KEYWORD, _KEYWORD_ONLY): 1972 raise ValueError('invalid method signature') 1973 1974 kind = params[0].kind 1975 if kind in (_POSITIONAL_OR_KEYWORD, _POSITIONAL_ONLY): 1976 # Drop first parameter: 1977 # '(p1, p2[, ...])' -> '(p2[, ...])' 1978 params = params[1:] 1979 else: 1980 if kind is not _VAR_POSITIONAL: 1981 # Unless we add a new parameter type we never 1982 # get here 1983 raise ValueError('invalid argument type') 1984 # It's a var-positional parameter. 1985 # Do nothing. '(*args[, ...])' -> '(*args[, ...])' 1986 1987 return sig.replace(parameters=params) 1988 1989 1990def _signature_is_builtin(obj): 1991 """Private helper to test if `obj` is a callable that might 1992 support Argument Clinic's __text_signature__ protocol. 1993 """ 1994 return (isbuiltin(obj) or 1995 ismethoddescriptor(obj) or 1996 isinstance(obj, _NonUserDefinedCallables) or 1997 # Can't test 'isinstance(type)' here, as it would 1998 # also be True for regular python classes 1999 obj in (type, object)) 2000 2001 2002def _signature_is_functionlike(obj): 2003 """Private helper to test if `obj` is a duck type of FunctionType. 2004 A good example of such objects are functions compiled with 2005 Cython, which have all attributes that a pure Python function 2006 would have, but have their code statically compiled. 2007 """ 2008 2009 if not callable(obj) or isclass(obj): 2010 # All function-like objects are obviously callables, 2011 # and not classes. 2012 return False 2013 2014 name = getattr(obj, '__name__', None) 2015 code = getattr(obj, '__code__', None) 2016 defaults = getattr(obj, '__defaults__', _void) # Important to use _void ... 2017 kwdefaults = getattr(obj, '__kwdefaults__', _void) # ... and not None here 2018 annotations = getattr(obj, '__annotations__', None) 2019 2020 return (isinstance(code, types.CodeType) and 2021 isinstance(name, str) and 2022 (defaults is None or isinstance(defaults, tuple)) and 2023 (kwdefaults is None or isinstance(kwdefaults, dict)) and 2024 (isinstance(annotations, (dict)) or annotations is None) ) 2025 2026 2027def _signature_get_bound_param(spec): 2028 """ Private helper to get first parameter name from a 2029 __text_signature__ of a builtin method, which should 2030 be in the following format: '($param1, ...)'. 2031 Assumptions are that the first argument won't have 2032 a default value or an annotation. 2033 """ 2034 2035 assert spec.startswith('($') 2036 2037 pos = spec.find(',') 2038 if pos == -1: 2039 pos = spec.find(')') 2040 2041 cpos = spec.find(':') 2042 assert cpos == -1 or cpos > pos 2043 2044 cpos = spec.find('=') 2045 assert cpos == -1 or cpos > pos 2046 2047 return spec[2:pos] 2048 2049 2050def _signature_strip_non_python_syntax(signature): 2051 """ 2052 Private helper function. Takes a signature in Argument Clinic's 2053 extended signature format. 2054 2055 Returns a tuple of three things: 2056 * that signature re-rendered in standard Python syntax, 2057 * the index of the "self" parameter (generally 0), or None if 2058 the function does not have a "self" parameter, and 2059 * the index of the last "positional only" parameter, 2060 or None if the signature has no positional-only parameters. 2061 """ 2062 2063 if not signature: 2064 return signature, None, None 2065 2066 self_parameter = None 2067 last_positional_only = None 2068 2069 lines = [l.encode('ascii') for l in signature.split('\n')] 2070 generator = iter(lines).__next__ 2071 token_stream = tokenize.tokenize(generator) 2072 2073 delayed_comma = False 2074 skip_next_comma = False 2075 text = [] 2076 add = text.append 2077 2078 current_parameter = 0 2079 OP = token.OP 2080 ERRORTOKEN = token.ERRORTOKEN 2081 2082 # token stream always starts with ENCODING token, skip it 2083 t = next(token_stream) 2084 assert t.type == tokenize.ENCODING 2085 2086 for t in token_stream: 2087 type, string = t.type, t.string 2088 2089 if type == OP: 2090 if string == ',': 2091 if skip_next_comma: 2092 skip_next_comma = False 2093 else: 2094 assert not delayed_comma 2095 delayed_comma = True 2096 current_parameter += 1 2097 continue 2098 2099 if string == '/': 2100 assert not skip_next_comma 2101 assert last_positional_only is None 2102 skip_next_comma = True 2103 last_positional_only = current_parameter - 1 2104 continue 2105 2106 if (type == ERRORTOKEN) and (string == '$'): 2107 assert self_parameter is None 2108 self_parameter = current_parameter 2109 continue 2110 2111 if delayed_comma: 2112 delayed_comma = False 2113 if not ((type == OP) and (string == ')')): 2114 add(', ') 2115 add(string) 2116 if (string == ','): 2117 add(' ') 2118 clean_signature = ''.join(text) 2119 return clean_signature, self_parameter, last_positional_only 2120 2121 2122def _signature_fromstr(cls, obj, s, skip_bound_arg=True): 2123 """Private helper to parse content of '__text_signature__' 2124 and return a Signature based on it. 2125 """ 2126 # Lazy import ast because it's relatively heavy and 2127 # it's not used for other than this function. 2128 import ast 2129 2130 Parameter = cls._parameter_cls 2131 2132 clean_signature, self_parameter, last_positional_only = \ 2133 _signature_strip_non_python_syntax(s) 2134 2135 program = "def foo" + clean_signature + ": pass" 2136 2137 try: 2138 module = ast.parse(program) 2139 except SyntaxError: 2140 module = None 2141 2142 if not isinstance(module, ast.Module): 2143 raise ValueError("{!r} builtin has invalid signature".format(obj)) 2144 2145 f = module.body[0] 2146 2147 parameters = [] 2148 empty = Parameter.empty 2149 invalid = object() 2150 2151 module = None 2152 module_dict = {} 2153 module_name = getattr(obj, '__module__', None) 2154 if module_name: 2155 module = sys.modules.get(module_name, None) 2156 if module: 2157 module_dict = module.__dict__ 2158 sys_module_dict = sys.modules.copy() 2159 2160 def parse_name(node): 2161 assert isinstance(node, ast.arg) 2162 if node.annotation is not None: 2163 raise ValueError("Annotations are not currently supported") 2164 return node.arg 2165 2166 def wrap_value(s): 2167 try: 2168 value = eval(s, module_dict) 2169 except NameError: 2170 try: 2171 value = eval(s, sys_module_dict) 2172 except NameError: 2173 raise RuntimeError() 2174 2175 if isinstance(value, (str, int, float, bytes, bool, type(None))): 2176 return ast.Constant(value) 2177 raise RuntimeError() 2178 2179 class RewriteSymbolics(ast.NodeTransformer): 2180 def visit_Attribute(self, node): 2181 a = [] 2182 n = node 2183 while isinstance(n, ast.Attribute): 2184 a.append(n.attr) 2185 n = n.value 2186 if not isinstance(n, ast.Name): 2187 raise RuntimeError() 2188 a.append(n.id) 2189 value = ".".join(reversed(a)) 2190 return wrap_value(value) 2191 2192 def visit_Name(self, node): 2193 if not isinstance(node.ctx, ast.Load): 2194 raise ValueError() 2195 return wrap_value(node.id) 2196 2197 def p(name_node, default_node, default=empty): 2198 name = parse_name(name_node) 2199 if name is invalid: 2200 return None 2201 if default_node and default_node is not _empty: 2202 try: 2203 default_node = RewriteSymbolics().visit(default_node) 2204 o = ast.literal_eval(default_node) 2205 except ValueError: 2206 o = invalid 2207 if o is invalid: 2208 return None 2209 default = o if o is not invalid else default 2210 parameters.append(Parameter(name, kind, default=default, annotation=empty)) 2211 2212 # non-keyword-only parameters 2213 args = reversed(f.args.args) 2214 defaults = reversed(f.args.defaults) 2215 iter = itertools.zip_longest(args, defaults, fillvalue=None) 2216 if last_positional_only is not None: 2217 kind = Parameter.POSITIONAL_ONLY 2218 else: 2219 kind = Parameter.POSITIONAL_OR_KEYWORD 2220 for i, (name, default) in enumerate(reversed(list(iter))): 2221 p(name, default) 2222 if i == last_positional_only: 2223 kind = Parameter.POSITIONAL_OR_KEYWORD 2224 2225 # *args 2226 if f.args.vararg: 2227 kind = Parameter.VAR_POSITIONAL 2228 p(f.args.vararg, empty) 2229 2230 # keyword-only arguments 2231 kind = Parameter.KEYWORD_ONLY 2232 for name, default in zip(f.args.kwonlyargs, f.args.kw_defaults): 2233 p(name, default) 2234 2235 # **kwargs 2236 if f.args.kwarg: 2237 kind = Parameter.VAR_KEYWORD 2238 p(f.args.kwarg, empty) 2239 2240 if self_parameter is not None: 2241 # Possibly strip the bound argument: 2242 # - We *always* strip first bound argument if 2243 # it is a module. 2244 # - We don't strip first bound argument if 2245 # skip_bound_arg is False. 2246 assert parameters 2247 _self = getattr(obj, '__self__', None) 2248 self_isbound = _self is not None 2249 self_ismodule = ismodule(_self) 2250 if self_isbound and (self_ismodule or skip_bound_arg): 2251 parameters.pop(0) 2252 else: 2253 # for builtins, self parameter is always positional-only! 2254 p = parameters[0].replace(kind=Parameter.POSITIONAL_ONLY) 2255 parameters[0] = p 2256 2257 return cls(parameters, return_annotation=cls.empty) 2258 2259 2260def _signature_from_builtin(cls, func, skip_bound_arg=True): 2261 """Private helper function to get signature for 2262 builtin callables. 2263 """ 2264 2265 if not _signature_is_builtin(func): 2266 raise TypeError("{!r} is not a Python builtin " 2267 "function".format(func)) 2268 2269 s = getattr(func, "__text_signature__", None) 2270 if not s: 2271 raise ValueError("no signature found for builtin {!r}".format(func)) 2272 2273 return _signature_fromstr(cls, func, s, skip_bound_arg) 2274 2275 2276def _signature_from_function(cls, func, skip_bound_arg=True, 2277 globals=None, locals=None, eval_str=False): 2278 """Private helper: constructs Signature for the given python function.""" 2279 2280 is_duck_function = False 2281 if not isfunction(func): 2282 if _signature_is_functionlike(func): 2283 is_duck_function = True 2284 else: 2285 # If it's not a pure Python function, and not a duck type 2286 # of pure function: 2287 raise TypeError('{!r} is not a Python function'.format(func)) 2288 2289 s = getattr(func, "__text_signature__", None) 2290 if s: 2291 return _signature_fromstr(cls, func, s, skip_bound_arg) 2292 2293 Parameter = cls._parameter_cls 2294 2295 # Parameter information. 2296 func_code = func.__code__ 2297 pos_count = func_code.co_argcount 2298 arg_names = func_code.co_varnames 2299 posonly_count = func_code.co_posonlyargcount 2300 positional = arg_names[:pos_count] 2301 keyword_only_count = func_code.co_kwonlyargcount 2302 keyword_only = arg_names[pos_count:pos_count + keyword_only_count] 2303 annotations = get_annotations(func, globals=globals, locals=locals, eval_str=eval_str) 2304 defaults = func.__defaults__ 2305 kwdefaults = func.__kwdefaults__ 2306 2307 if defaults: 2308 pos_default_count = len(defaults) 2309 else: 2310 pos_default_count = 0 2311 2312 parameters = [] 2313 2314 non_default_count = pos_count - pos_default_count 2315 posonly_left = posonly_count 2316 2317 # Non-keyword-only parameters w/o defaults. 2318 for name in positional[:non_default_count]: 2319 kind = _POSITIONAL_ONLY if posonly_left else _POSITIONAL_OR_KEYWORD 2320 annotation = annotations.get(name, _empty) 2321 parameters.append(Parameter(name, annotation=annotation, 2322 kind=kind)) 2323 if posonly_left: 2324 posonly_left -= 1 2325 2326 # ... w/ defaults. 2327 for offset, name in enumerate(positional[non_default_count:]): 2328 kind = _POSITIONAL_ONLY if posonly_left else _POSITIONAL_OR_KEYWORD 2329 annotation = annotations.get(name, _empty) 2330 parameters.append(Parameter(name, annotation=annotation, 2331 kind=kind, 2332 default=defaults[offset])) 2333 if posonly_left: 2334 posonly_left -= 1 2335 2336 # *args 2337 if func_code.co_flags & CO_VARARGS: 2338 name = arg_names[pos_count + keyword_only_count] 2339 annotation = annotations.get(name, _empty) 2340 parameters.append(Parameter(name, annotation=annotation, 2341 kind=_VAR_POSITIONAL)) 2342 2343 # Keyword-only parameters. 2344 for name in keyword_only: 2345 default = _empty 2346 if kwdefaults is not None: 2347 default = kwdefaults.get(name, _empty) 2348 2349 annotation = annotations.get(name, _empty) 2350 parameters.append(Parameter(name, annotation=annotation, 2351 kind=_KEYWORD_ONLY, 2352 default=default)) 2353 # **kwargs 2354 if func_code.co_flags & CO_VARKEYWORDS: 2355 index = pos_count + keyword_only_count 2356 if func_code.co_flags & CO_VARARGS: 2357 index += 1 2358 2359 name = arg_names[index] 2360 annotation = annotations.get(name, _empty) 2361 parameters.append(Parameter(name, annotation=annotation, 2362 kind=_VAR_KEYWORD)) 2363 2364 # Is 'func' is a pure Python function - don't validate the 2365 # parameters list (for correct order and defaults), it should be OK. 2366 return cls(parameters, 2367 return_annotation=annotations.get('return', _empty), 2368 __validate_parameters__=is_duck_function) 2369 2370 2371def _signature_from_callable(obj, *, 2372 follow_wrapper_chains=True, 2373 skip_bound_arg=True, 2374 globals=None, 2375 locals=None, 2376 eval_str=False, 2377 sigcls): 2378 2379 """Private helper function to get signature for arbitrary 2380 callable objects. 2381 """ 2382 2383 _get_signature_of = functools.partial(_signature_from_callable, 2384 follow_wrapper_chains=follow_wrapper_chains, 2385 skip_bound_arg=skip_bound_arg, 2386 globals=globals, 2387 locals=locals, 2388 sigcls=sigcls, 2389 eval_str=eval_str) 2390 2391 if not callable(obj): 2392 raise TypeError('{!r} is not a callable object'.format(obj)) 2393 2394 if isinstance(obj, types.MethodType): 2395 # In this case we skip the first parameter of the underlying 2396 # function (usually `self` or `cls`). 2397 sig = _get_signature_of(obj.__func__) 2398 2399 if skip_bound_arg: 2400 return _signature_bound_method(sig) 2401 else: 2402 return sig 2403 2404 # Was this function wrapped by a decorator? 2405 if follow_wrapper_chains: 2406 obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__"))) 2407 if isinstance(obj, types.MethodType): 2408 # If the unwrapped object is a *method*, we might want to 2409 # skip its first parameter (self). 2410 # See test_signature_wrapped_bound_method for details. 2411 return _get_signature_of(obj) 2412 2413 try: 2414 sig = obj.__signature__ 2415 except AttributeError: 2416 pass 2417 else: 2418 if sig is not None: 2419 if not isinstance(sig, Signature): 2420 raise TypeError( 2421 'unexpected object {!r} in __signature__ ' 2422 'attribute'.format(sig)) 2423 return sig 2424 2425 try: 2426 partialmethod = obj._partialmethod 2427 except AttributeError: 2428 pass 2429 else: 2430 if isinstance(partialmethod, functools.partialmethod): 2431 # Unbound partialmethod (see functools.partialmethod) 2432 # This means, that we need to calculate the signature 2433 # as if it's a regular partial object, but taking into 2434 # account that the first positional argument 2435 # (usually `self`, or `cls`) will not be passed 2436 # automatically (as for boundmethods) 2437 2438 wrapped_sig = _get_signature_of(partialmethod.func) 2439 2440 sig = _signature_get_partial(wrapped_sig, partialmethod, (None,)) 2441 first_wrapped_param = tuple(wrapped_sig.parameters.values())[0] 2442 if first_wrapped_param.kind is Parameter.VAR_POSITIONAL: 2443 # First argument of the wrapped callable is `*args`, as in 2444 # `partialmethod(lambda *args)`. 2445 return sig 2446 else: 2447 sig_params = tuple(sig.parameters.values()) 2448 assert (not sig_params or 2449 first_wrapped_param is not sig_params[0]) 2450 new_params = (first_wrapped_param,) + sig_params 2451 return sig.replace(parameters=new_params) 2452 2453 if isfunction(obj) or _signature_is_functionlike(obj): 2454 # If it's a pure Python function, or an object that is duck type 2455 # of a Python function (Cython functions, for instance), then: 2456 return _signature_from_function(sigcls, obj, 2457 skip_bound_arg=skip_bound_arg, 2458 globals=globals, locals=locals, eval_str=eval_str) 2459 2460 if _signature_is_builtin(obj): 2461 return _signature_from_builtin(sigcls, obj, 2462 skip_bound_arg=skip_bound_arg) 2463 2464 if isinstance(obj, functools.partial): 2465 wrapped_sig = _get_signature_of(obj.func) 2466 return _signature_get_partial(wrapped_sig, obj) 2467 2468 sig = None 2469 if isinstance(obj, type): 2470 # obj is a class or a metaclass 2471 2472 # First, let's see if it has an overloaded __call__ defined 2473 # in its metaclass 2474 call = _signature_get_user_defined_method(type(obj), '__call__') 2475 if call is not None: 2476 sig = _get_signature_of(call) 2477 else: 2478 factory_method = None 2479 new = _signature_get_user_defined_method(obj, '__new__') 2480 init = _signature_get_user_defined_method(obj, '__init__') 2481 # Now we check if the 'obj' class has an own '__new__' method 2482 if '__new__' in obj.__dict__: 2483 factory_method = new 2484 # or an own '__init__' method 2485 elif '__init__' in obj.__dict__: 2486 factory_method = init 2487 # If not, we take inherited '__new__' or '__init__', if present 2488 elif new is not None: 2489 factory_method = new 2490 elif init is not None: 2491 factory_method = init 2492 2493 if factory_method is not None: 2494 sig = _get_signature_of(factory_method) 2495 2496 if sig is None: 2497 # At this point we know, that `obj` is a class, with no user- 2498 # defined '__init__', '__new__', or class-level '__call__' 2499 2500 for base in obj.__mro__[:-1]: 2501 # Since '__text_signature__' is implemented as a 2502 # descriptor that extracts text signature from the 2503 # class docstring, if 'obj' is derived from a builtin 2504 # class, its own '__text_signature__' may be 'None'. 2505 # Therefore, we go through the MRO (except the last 2506 # class in there, which is 'object') to find the first 2507 # class with non-empty text signature. 2508 try: 2509 text_sig = base.__text_signature__ 2510 except AttributeError: 2511 pass 2512 else: 2513 if text_sig: 2514 # If 'obj' class has a __text_signature__ attribute: 2515 # return a signature based on it 2516 return _signature_fromstr(sigcls, obj, text_sig) 2517 2518 # No '__text_signature__' was found for the 'obj' class. 2519 # Last option is to check if its '__init__' is 2520 # object.__init__ or type.__init__. 2521 if type not in obj.__mro__: 2522 # We have a class (not metaclass), but no user-defined 2523 # __init__ or __new__ for it 2524 if (obj.__init__ is object.__init__ and 2525 obj.__new__ is object.__new__): 2526 # Return a signature of 'object' builtin. 2527 return sigcls.from_callable(object) 2528 else: 2529 raise ValueError( 2530 'no signature found for builtin type {!r}'.format(obj)) 2531 2532 elif not isinstance(obj, _NonUserDefinedCallables): 2533 # An object with __call__ 2534 # We also check that the 'obj' is not an instance of 2535 # _WrapperDescriptor or _MethodWrapper to avoid 2536 # infinite recursion (and even potential segfault) 2537 call = _signature_get_user_defined_method(type(obj), '__call__') 2538 if call is not None: 2539 try: 2540 sig = _get_signature_of(call) 2541 except ValueError as ex: 2542 msg = 'no signature found for {!r}'.format(obj) 2543 raise ValueError(msg) from ex 2544 2545 if sig is not None: 2546 # For classes and objects we skip the first parameter of their 2547 # __call__, __new__, or __init__ methods 2548 if skip_bound_arg: 2549 return _signature_bound_method(sig) 2550 else: 2551 return sig 2552 2553 if isinstance(obj, types.BuiltinFunctionType): 2554 # Raise a nicer error message for builtins 2555 msg = 'no signature found for builtin function {!r}'.format(obj) 2556 raise ValueError(msg) 2557 2558 raise ValueError('callable {!r} is not supported by signature'.format(obj)) 2559 2560 2561class _void: 2562 """A private marker - used in Parameter & Signature.""" 2563 2564 2565class _empty: 2566 """Marker object for Signature.empty and Parameter.empty.""" 2567 2568 2569class _ParameterKind(enum.IntEnum): 2570 POSITIONAL_ONLY = 0 2571 POSITIONAL_OR_KEYWORD = 1 2572 VAR_POSITIONAL = 2 2573 KEYWORD_ONLY = 3 2574 VAR_KEYWORD = 4 2575 2576 def __str__(self): 2577 return self._name_ 2578 2579 @property 2580 def description(self): 2581 return _PARAM_NAME_MAPPING[self] 2582 2583_POSITIONAL_ONLY = _ParameterKind.POSITIONAL_ONLY 2584_POSITIONAL_OR_KEYWORD = _ParameterKind.POSITIONAL_OR_KEYWORD 2585_VAR_POSITIONAL = _ParameterKind.VAR_POSITIONAL 2586_KEYWORD_ONLY = _ParameterKind.KEYWORD_ONLY 2587_VAR_KEYWORD = _ParameterKind.VAR_KEYWORD 2588 2589_PARAM_NAME_MAPPING = { 2590 _POSITIONAL_ONLY: 'positional-only', 2591 _POSITIONAL_OR_KEYWORD: 'positional or keyword', 2592 _VAR_POSITIONAL: 'variadic positional', 2593 _KEYWORD_ONLY: 'keyword-only', 2594 _VAR_KEYWORD: 'variadic keyword' 2595} 2596 2597 2598class Parameter: 2599 """Represents a parameter in a function signature. 2600 2601 Has the following public attributes: 2602 2603 * name : str 2604 The name of the parameter as a string. 2605 * default : object 2606 The default value for the parameter if specified. If the 2607 parameter has no default value, this attribute is set to 2608 `Parameter.empty`. 2609 * annotation 2610 The annotation for the parameter if specified. If the 2611 parameter has no annotation, this attribute is set to 2612 `Parameter.empty`. 2613 * kind : str 2614 Describes how argument values are bound to the parameter. 2615 Possible values: `Parameter.POSITIONAL_ONLY`, 2616 `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`, 2617 `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`. 2618 """ 2619 2620 __slots__ = ('_name', '_kind', '_default', '_annotation') 2621 2622 POSITIONAL_ONLY = _POSITIONAL_ONLY 2623 POSITIONAL_OR_KEYWORD = _POSITIONAL_OR_KEYWORD 2624 VAR_POSITIONAL = _VAR_POSITIONAL 2625 KEYWORD_ONLY = _KEYWORD_ONLY 2626 VAR_KEYWORD = _VAR_KEYWORD 2627 2628 empty = _empty 2629 2630 def __init__(self, name, kind, *, default=_empty, annotation=_empty): 2631 try: 2632 self._kind = _ParameterKind(kind) 2633 except ValueError: 2634 raise ValueError(f'value {kind!r} is not a valid Parameter.kind') 2635 if default is not _empty: 2636 if self._kind in (_VAR_POSITIONAL, _VAR_KEYWORD): 2637 msg = '{} parameters cannot have default values' 2638 msg = msg.format(self._kind.description) 2639 raise ValueError(msg) 2640 self._default = default 2641 self._annotation = annotation 2642 2643 if name is _empty: 2644 raise ValueError('name is a required attribute for Parameter') 2645 2646 if not isinstance(name, str): 2647 msg = 'name must be a str, not a {}'.format(type(name).__name__) 2648 raise TypeError(msg) 2649 2650 if name[0] == '.' and name[1:].isdigit(): 2651 # These are implicit arguments generated by comprehensions. In 2652 # order to provide a friendlier interface to users, we recast 2653 # their name as "implicitN" and treat them as positional-only. 2654 # See issue 19611. 2655 if self._kind != _POSITIONAL_OR_KEYWORD: 2656 msg = ( 2657 'implicit arguments must be passed as ' 2658 'positional or keyword arguments, not {}' 2659 ) 2660 msg = msg.format(self._kind.description) 2661 raise ValueError(msg) 2662 self._kind = _POSITIONAL_ONLY 2663 name = 'implicit{}'.format(name[1:]) 2664 2665 if not name.isidentifier(): 2666 raise ValueError('{!r} is not a valid parameter name'.format(name)) 2667 2668 self._name = name 2669 2670 def __reduce__(self): 2671 return (type(self), 2672 (self._name, self._kind), 2673 {'_default': self._default, 2674 '_annotation': self._annotation}) 2675 2676 def __setstate__(self, state): 2677 self._default = state['_default'] 2678 self._annotation = state['_annotation'] 2679 2680 @property 2681 def name(self): 2682 return self._name 2683 2684 @property 2685 def default(self): 2686 return self._default 2687 2688 @property 2689 def annotation(self): 2690 return self._annotation 2691 2692 @property 2693 def kind(self): 2694 return self._kind 2695 2696 def replace(self, *, name=_void, kind=_void, 2697 annotation=_void, default=_void): 2698 """Creates a customized copy of the Parameter.""" 2699 2700 if name is _void: 2701 name = self._name 2702 2703 if kind is _void: 2704 kind = self._kind 2705 2706 if annotation is _void: 2707 annotation = self._annotation 2708 2709 if default is _void: 2710 default = self._default 2711 2712 return type(self)(name, kind, default=default, annotation=annotation) 2713 2714 def __str__(self): 2715 kind = self.kind 2716 formatted = self._name 2717 2718 # Add annotation and default value 2719 if self._annotation is not _empty: 2720 formatted = '{}: {}'.format(formatted, 2721 formatannotation(self._annotation)) 2722 2723 if self._default is not _empty: 2724 if self._annotation is not _empty: 2725 formatted = '{} = {}'.format(formatted, repr(self._default)) 2726 else: 2727 formatted = '{}={}'.format(formatted, repr(self._default)) 2728 2729 if kind == _VAR_POSITIONAL: 2730 formatted = '*' + formatted 2731 elif kind == _VAR_KEYWORD: 2732 formatted = '**' + formatted 2733 2734 return formatted 2735 2736 def __repr__(self): 2737 return '<{} "{}">'.format(self.__class__.__name__, self) 2738 2739 def __hash__(self): 2740 return hash((self.name, self.kind, self.annotation, self.default)) 2741 2742 def __eq__(self, other): 2743 if self is other: 2744 return True 2745 if not isinstance(other, Parameter): 2746 return NotImplemented 2747 return (self._name == other._name and 2748 self._kind == other._kind and 2749 self._default == other._default and 2750 self._annotation == other._annotation) 2751 2752 2753class BoundArguments: 2754 """Result of `Signature.bind` call. Holds the mapping of arguments 2755 to the function's parameters. 2756 2757 Has the following public attributes: 2758 2759 * arguments : dict 2760 An ordered mutable mapping of parameters' names to arguments' values. 2761 Does not contain arguments' default values. 2762 * signature : Signature 2763 The Signature object that created this instance. 2764 * args : tuple 2765 Tuple of positional arguments values. 2766 * kwargs : dict 2767 Dict of keyword arguments values. 2768 """ 2769 2770 __slots__ = ('arguments', '_signature', '__weakref__') 2771 2772 def __init__(self, signature, arguments): 2773 self.arguments = arguments 2774 self._signature = signature 2775 2776 @property 2777 def signature(self): 2778 return self._signature 2779 2780 @property 2781 def args(self): 2782 args = [] 2783 for param_name, param in self._signature.parameters.items(): 2784 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY): 2785 break 2786 2787 try: 2788 arg = self.arguments[param_name] 2789 except KeyError: 2790 # We're done here. Other arguments 2791 # will be mapped in 'BoundArguments.kwargs' 2792 break 2793 else: 2794 if param.kind == _VAR_POSITIONAL: 2795 # *args 2796 args.extend(arg) 2797 else: 2798 # plain argument 2799 args.append(arg) 2800 2801 return tuple(args) 2802 2803 @property 2804 def kwargs(self): 2805 kwargs = {} 2806 kwargs_started = False 2807 for param_name, param in self._signature.parameters.items(): 2808 if not kwargs_started: 2809 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY): 2810 kwargs_started = True 2811 else: 2812 if param_name not in self.arguments: 2813 kwargs_started = True 2814 continue 2815 2816 if not kwargs_started: 2817 continue 2818 2819 try: 2820 arg = self.arguments[param_name] 2821 except KeyError: 2822 pass 2823 else: 2824 if param.kind == _VAR_KEYWORD: 2825 # **kwargs 2826 kwargs.update(arg) 2827 else: 2828 # plain keyword argument 2829 kwargs[param_name] = arg 2830 2831 return kwargs 2832 2833 def apply_defaults(self): 2834 """Set default values for missing arguments. 2835 2836 For variable-positional arguments (*args) the default is an 2837 empty tuple. 2838 2839 For variable-keyword arguments (**kwargs) the default is an 2840 empty dict. 2841 """ 2842 arguments = self.arguments 2843 new_arguments = [] 2844 for name, param in self._signature.parameters.items(): 2845 try: 2846 new_arguments.append((name, arguments[name])) 2847 except KeyError: 2848 if param.default is not _empty: 2849 val = param.default 2850 elif param.kind is _VAR_POSITIONAL: 2851 val = () 2852 elif param.kind is _VAR_KEYWORD: 2853 val = {} 2854 else: 2855 # This BoundArguments was likely produced by 2856 # Signature.bind_partial(). 2857 continue 2858 new_arguments.append((name, val)) 2859 self.arguments = dict(new_arguments) 2860 2861 def __eq__(self, other): 2862 if self is other: 2863 return True 2864 if not isinstance(other, BoundArguments): 2865 return NotImplemented 2866 return (self.signature == other.signature and 2867 self.arguments == other.arguments) 2868 2869 def __setstate__(self, state): 2870 self._signature = state['_signature'] 2871 self.arguments = state['arguments'] 2872 2873 def __getstate__(self): 2874 return {'_signature': self._signature, 'arguments': self.arguments} 2875 2876 def __repr__(self): 2877 args = [] 2878 for arg, value in self.arguments.items(): 2879 args.append('{}={!r}'.format(arg, value)) 2880 return '<{} ({})>'.format(self.__class__.__name__, ', '.join(args)) 2881 2882 2883class Signature: 2884 """A Signature object represents the overall signature of a function. 2885 It stores a Parameter object for each parameter accepted by the 2886 function, as well as information specific to the function itself. 2887 2888 A Signature object has the following public attributes and methods: 2889 2890 * parameters : OrderedDict 2891 An ordered mapping of parameters' names to the corresponding 2892 Parameter objects (keyword-only arguments are in the same order 2893 as listed in `code.co_varnames`). 2894 * return_annotation : object 2895 The annotation for the return type of the function if specified. 2896 If the function has no annotation for its return type, this 2897 attribute is set to `Signature.empty`. 2898 * bind(*args, **kwargs) -> BoundArguments 2899 Creates a mapping from positional and keyword arguments to 2900 parameters. 2901 * bind_partial(*args, **kwargs) -> BoundArguments 2902 Creates a partial mapping from positional and keyword arguments 2903 to parameters (simulating 'functools.partial' behavior.) 2904 """ 2905 2906 __slots__ = ('_return_annotation', '_parameters') 2907 2908 _parameter_cls = Parameter 2909 _bound_arguments_cls = BoundArguments 2910 2911 empty = _empty 2912 2913 def __init__(self, parameters=None, *, return_annotation=_empty, 2914 __validate_parameters__=True): 2915 """Constructs Signature from the given list of Parameter 2916 objects and 'return_annotation'. All arguments are optional. 2917 """ 2918 2919 if parameters is None: 2920 params = OrderedDict() 2921 else: 2922 if __validate_parameters__: 2923 params = OrderedDict() 2924 top_kind = _POSITIONAL_ONLY 2925 kind_defaults = False 2926 2927 for param in parameters: 2928 kind = param.kind 2929 name = param.name 2930 2931 if kind < top_kind: 2932 msg = ( 2933 'wrong parameter order: {} parameter before {} ' 2934 'parameter' 2935 ) 2936 msg = msg.format(top_kind.description, 2937 kind.description) 2938 raise ValueError(msg) 2939 elif kind > top_kind: 2940 kind_defaults = False 2941 top_kind = kind 2942 2943 if kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD): 2944 if param.default is _empty: 2945 if kind_defaults: 2946 # No default for this parameter, but the 2947 # previous parameter of the same kind had 2948 # a default 2949 msg = 'non-default argument follows default ' \ 2950 'argument' 2951 raise ValueError(msg) 2952 else: 2953 # There is a default for this parameter. 2954 kind_defaults = True 2955 2956 if name in params: 2957 msg = 'duplicate parameter name: {!r}'.format(name) 2958 raise ValueError(msg) 2959 2960 params[name] = param 2961 else: 2962 params = OrderedDict((param.name, param) for param in parameters) 2963 2964 self._parameters = types.MappingProxyType(params) 2965 self._return_annotation = return_annotation 2966 2967 @classmethod 2968 def from_function(cls, func): 2969 """Constructs Signature for the given python function. 2970 2971 Deprecated since Python 3.5, use `Signature.from_callable()`. 2972 """ 2973 2974 warnings.warn("inspect.Signature.from_function() is deprecated since " 2975 "Python 3.5, use Signature.from_callable()", 2976 DeprecationWarning, stacklevel=2) 2977 return _signature_from_function(cls, func) 2978 2979 @classmethod 2980 def from_builtin(cls, func): 2981 """Constructs Signature for the given builtin function. 2982 2983 Deprecated since Python 3.5, use `Signature.from_callable()`. 2984 """ 2985 2986 warnings.warn("inspect.Signature.from_builtin() is deprecated since " 2987 "Python 3.5, use Signature.from_callable()", 2988 DeprecationWarning, stacklevel=2) 2989 return _signature_from_builtin(cls, func) 2990 2991 @classmethod 2992 def from_callable(cls, obj, *, 2993 follow_wrapped=True, globals=None, locals=None, eval_str=False): 2994 """Constructs Signature for the given callable object.""" 2995 return _signature_from_callable(obj, sigcls=cls, 2996 follow_wrapper_chains=follow_wrapped, 2997 globals=globals, locals=locals, eval_str=eval_str) 2998 2999 @property 3000 def parameters(self): 3001 return self._parameters 3002 3003 @property 3004 def return_annotation(self): 3005 return self._return_annotation 3006 3007 def replace(self, *, parameters=_void, return_annotation=_void): 3008 """Creates a customized copy of the Signature. 3009 Pass 'parameters' and/or 'return_annotation' arguments 3010 to override them in the new copy. 3011 """ 3012 3013 if parameters is _void: 3014 parameters = self.parameters.values() 3015 3016 if return_annotation is _void: 3017 return_annotation = self._return_annotation 3018 3019 return type(self)(parameters, 3020 return_annotation=return_annotation) 3021 3022 def _hash_basis(self): 3023 params = tuple(param for param in self.parameters.values() 3024 if param.kind != _KEYWORD_ONLY) 3025 3026 kwo_params = {param.name: param for param in self.parameters.values() 3027 if param.kind == _KEYWORD_ONLY} 3028 3029 return params, kwo_params, self.return_annotation 3030 3031 def __hash__(self): 3032 params, kwo_params, return_annotation = self._hash_basis() 3033 kwo_params = frozenset(kwo_params.values()) 3034 return hash((params, kwo_params, return_annotation)) 3035 3036 def __eq__(self, other): 3037 if self is other: 3038 return True 3039 if not isinstance(other, Signature): 3040 return NotImplemented 3041 return self._hash_basis() == other._hash_basis() 3042 3043 def _bind(self, args, kwargs, *, partial=False): 3044 """Private method. Don't use directly.""" 3045 3046 arguments = {} 3047 3048 parameters = iter(self.parameters.values()) 3049 parameters_ex = () 3050 arg_vals = iter(args) 3051 3052 while True: 3053 # Let's iterate through the positional arguments and corresponding 3054 # parameters 3055 try: 3056 arg_val = next(arg_vals) 3057 except StopIteration: 3058 # No more positional arguments 3059 try: 3060 param = next(parameters) 3061 except StopIteration: 3062 # No more parameters. That's it. Just need to check that 3063 # we have no `kwargs` after this while loop 3064 break 3065 else: 3066 if param.kind == _VAR_POSITIONAL: 3067 # That's OK, just empty *args. Let's start parsing 3068 # kwargs 3069 break 3070 elif param.name in kwargs: 3071 if param.kind == _POSITIONAL_ONLY: 3072 msg = '{arg!r} parameter is positional only, ' \ 3073 'but was passed as a keyword' 3074 msg = msg.format(arg=param.name) 3075 raise TypeError(msg) from None 3076 parameters_ex = (param,) 3077 break 3078 elif (param.kind == _VAR_KEYWORD or 3079 param.default is not _empty): 3080 # That's fine too - we have a default value for this 3081 # parameter. So, lets start parsing `kwargs`, starting 3082 # with the current parameter 3083 parameters_ex = (param,) 3084 break 3085 else: 3086 # No default, not VAR_KEYWORD, not VAR_POSITIONAL, 3087 # not in `kwargs` 3088 if partial: 3089 parameters_ex = (param,) 3090 break 3091 else: 3092 msg = 'missing a required argument: {arg!r}' 3093 msg = msg.format(arg=param.name) 3094 raise TypeError(msg) from None 3095 else: 3096 # We have a positional argument to process 3097 try: 3098 param = next(parameters) 3099 except StopIteration: 3100 raise TypeError('too many positional arguments') from None 3101 else: 3102 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY): 3103 # Looks like we have no parameter for this positional 3104 # argument 3105 raise TypeError( 3106 'too many positional arguments') from None 3107 3108 if param.kind == _VAR_POSITIONAL: 3109 # We have an '*args'-like argument, let's fill it with 3110 # all positional arguments we have left and move on to 3111 # the next phase 3112 values = [arg_val] 3113 values.extend(arg_vals) 3114 arguments[param.name] = tuple(values) 3115 break 3116 3117 if param.name in kwargs and param.kind != _POSITIONAL_ONLY: 3118 raise TypeError( 3119 'multiple values for argument {arg!r}'.format( 3120 arg=param.name)) from None 3121 3122 arguments[param.name] = arg_val 3123 3124 # Now, we iterate through the remaining parameters to process 3125 # keyword arguments 3126 kwargs_param = None 3127 for param in itertools.chain(parameters_ex, parameters): 3128 if param.kind == _VAR_KEYWORD: 3129 # Memorize that we have a '**kwargs'-like parameter 3130 kwargs_param = param 3131 continue 3132 3133 if param.kind == _VAR_POSITIONAL: 3134 # Named arguments don't refer to '*args'-like parameters. 3135 # We only arrive here if the positional arguments ended 3136 # before reaching the last parameter before *args. 3137 continue 3138 3139 param_name = param.name 3140 try: 3141 arg_val = kwargs.pop(param_name) 3142 except KeyError: 3143 # We have no value for this parameter. It's fine though, 3144 # if it has a default value, or it is an '*args'-like 3145 # parameter, left alone by the processing of positional 3146 # arguments. 3147 if (not partial and param.kind != _VAR_POSITIONAL and 3148 param.default is _empty): 3149 raise TypeError('missing a required argument: {arg!r}'. \ 3150 format(arg=param_name)) from None 3151 3152 else: 3153 if param.kind == _POSITIONAL_ONLY: 3154 # This should never happen in case of a properly built 3155 # Signature object (but let's have this check here 3156 # to ensure correct behaviour just in case) 3157 raise TypeError('{arg!r} parameter is positional only, ' 3158 'but was passed as a keyword'. \ 3159 format(arg=param.name)) 3160 3161 arguments[param_name] = arg_val 3162 3163 if kwargs: 3164 if kwargs_param is not None: 3165 # Process our '**kwargs'-like parameter 3166 arguments[kwargs_param.name] = kwargs 3167 else: 3168 raise TypeError( 3169 'got an unexpected keyword argument {arg!r}'.format( 3170 arg=next(iter(kwargs)))) 3171 3172 return self._bound_arguments_cls(self, arguments) 3173 3174 def bind(self, /, *args, **kwargs): 3175 """Get a BoundArguments object, that maps the passed `args` 3176 and `kwargs` to the function's signature. Raises `TypeError` 3177 if the passed arguments can not be bound. 3178 """ 3179 return self._bind(args, kwargs) 3180 3181 def bind_partial(self, /, *args, **kwargs): 3182 """Get a BoundArguments object, that partially maps the 3183 passed `args` and `kwargs` to the function's signature. 3184 Raises `TypeError` if the passed arguments can not be bound. 3185 """ 3186 return self._bind(args, kwargs, partial=True) 3187 3188 def __reduce__(self): 3189 return (type(self), 3190 (tuple(self._parameters.values()),), 3191 {'_return_annotation': self._return_annotation}) 3192 3193 def __setstate__(self, state): 3194 self._return_annotation = state['_return_annotation'] 3195 3196 def __repr__(self): 3197 return '<{} {}>'.format(self.__class__.__name__, self) 3198 3199 def __str__(self): 3200 result = [] 3201 render_pos_only_separator = False 3202 render_kw_only_separator = True 3203 for param in self.parameters.values(): 3204 formatted = str(param) 3205 3206 kind = param.kind 3207 3208 if kind == _POSITIONAL_ONLY: 3209 render_pos_only_separator = True 3210 elif render_pos_only_separator: 3211 # It's not a positional-only parameter, and the flag 3212 # is set to 'True' (there were pos-only params before.) 3213 result.append('/') 3214 render_pos_only_separator = False 3215 3216 if kind == _VAR_POSITIONAL: 3217 # OK, we have an '*args'-like parameter, so we won't need 3218 # a '*' to separate keyword-only arguments 3219 render_kw_only_separator = False 3220 elif kind == _KEYWORD_ONLY and render_kw_only_separator: 3221 # We have a keyword-only parameter to render and we haven't 3222 # rendered an '*args'-like parameter before, so add a '*' 3223 # separator to the parameters list ("foo(arg1, *, arg2)" case) 3224 result.append('*') 3225 # This condition should be only triggered once, so 3226 # reset the flag 3227 render_kw_only_separator = False 3228 3229 result.append(formatted) 3230 3231 if render_pos_only_separator: 3232 # There were only positional-only parameters, hence the 3233 # flag was not reset to 'False' 3234 result.append('/') 3235 3236 rendered = '({})'.format(', '.join(result)) 3237 3238 if self.return_annotation is not _empty: 3239 anno = formatannotation(self.return_annotation) 3240 rendered += ' -> {}'.format(anno) 3241 3242 return rendered 3243 3244 3245def signature(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False): 3246 """Get a signature object for the passed callable.""" 3247 return Signature.from_callable(obj, follow_wrapped=follow_wrapped, 3248 globals=globals, locals=locals, eval_str=eval_str) 3249 3250 3251def _main(): 3252 """ Logic for inspecting an object given at command line """ 3253 import argparse 3254 import importlib 3255 3256 parser = argparse.ArgumentParser() 3257 parser.add_argument( 3258 'object', 3259 help="The object to be analysed. " 3260 "It supports the 'module:qualname' syntax") 3261 parser.add_argument( 3262 '-d', '--details', action='store_true', 3263 help='Display info about the module rather than its source code') 3264 3265 args = parser.parse_args() 3266 3267 target = args.object 3268 mod_name, has_attrs, attrs = target.partition(":") 3269 try: 3270 obj = module = importlib.import_module(mod_name) 3271 except Exception as exc: 3272 msg = "Failed to import {} ({}: {})".format(mod_name, 3273 type(exc).__name__, 3274 exc) 3275 print(msg, file=sys.stderr) 3276 sys.exit(2) 3277 3278 if has_attrs: 3279 parts = attrs.split(".") 3280 obj = module 3281 for part in parts: 3282 obj = getattr(obj, part) 3283 3284 if module.__name__ in sys.builtin_module_names: 3285 print("Can't get info for builtin modules.", file=sys.stderr) 3286 sys.exit(1) 3287 3288 if args.details: 3289 print('Target: {}'.format(target)) 3290 print('Origin: {}'.format(getsourcefile(module))) 3291 print('Cached: {}'.format(module.__cached__)) 3292 if obj is module: 3293 print('Loader: {}'.format(repr(module.__loader__))) 3294 if hasattr(module, '__path__'): 3295 print('Submodule search path: {}'.format(module.__path__)) 3296 else: 3297 try: 3298 __, lineno = findsource(obj) 3299 except Exception: 3300 pass 3301 else: 3302 print('Line: {}'.format(lineno)) 3303 3304 print('\n') 3305 else: 3306 print(getsource(obj)) 3307 3308 3309if __name__ == "__main__": 3310 _main() 3311