diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2019-04-30 01:01:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-30 01:01:14 (GMT) |
commit | d5d2b4546939b98244708e5bb0cfccd55b99d244 (patch) | |
tree | 2a98e93bcad785c97f88154d275a4662afa40f8c /Lib/inspect.py | |
parent | 81c5a905951aaf46f292eb459c32649c0b74ef61 (diff) | |
download | cpython-d5d2b4546939b98244708e5bb0cfccd55b99d244.zip cpython-d5d2b4546939b98244708e5bb0cfccd55b99d244.tar.gz cpython-d5d2b4546939b98244708e5bb0cfccd55b99d244.tar.bz2 |
bpo-36751: Deprecate getfullargspec and report positional-only args as regular args (GH-13016)
* bpo-36751: Deprecate getfullargspec and report positional-only args as regular args
* Use inspect.signature in testhelpers
Diffstat (limited to 'Lib/inspect.py')
-rw-r--r-- | Lib/inspect.py | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py index 3201e79..fffca22 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1081,16 +1081,15 @@ def getargspec(func): warnings.warn("inspect.getargspec() is deprecated since Python 3.0, " "use inspect.signature() or inspect.getfullargspec()", DeprecationWarning, stacklevel=2) - args, varargs, varkw, defaults, posonlyargs, kwonlyargs, \ - kwonlydefaults, ann = getfullargspec(func) - if posonlyargs or kwonlyargs or ann: - raise ValueError("Function has positional-only, keyword-only parameters" - " or annotations, use getfullargspec() API which can" - " support them") + args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \ + getfullargspec(func) + if kwonlyargs or ann: + raise ValueError("Function has keyword-only parameters or annotations" + ", use inspect.signature() API which can support them") return ArgSpec(args, varargs, varkw, defaults) FullArgSpec = namedtuple('FullArgSpec', - 'args, varargs, varkw, defaults, posonlyargs, kwonlyargs, kwonlydefaults, annotations') + 'args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations') def getfullargspec(func): """Get the names and default values of a callable object's parameters. @@ -1104,11 +1103,16 @@ def getfullargspec(func): 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults. 'annotations' is a dictionary mapping parameter names to annotations. + .. deprecated:: 3.8 + Use inspect.signature() instead of inspect.getfullargspec(). + Notable differences from inspect.signature(): - the "self" parameter is always reported, even for bound methods - wrapper chains defined by __wrapped__ *not* unwrapped automatically """ + warnings.warn("Use inspect.signature() instead of inspect.getfullargspec()", + DeprecationWarning) try: # Re: `skip_bound_arg=False` # @@ -1182,8 +1186,8 @@ def getfullargspec(func): # compatibility with 'func.__defaults__' defaults = None - return FullArgSpec(args, varargs, varkw, defaults, - posonlyargs, kwonlyargs, kwdefaults, annotations) + return FullArgSpec(posonlyargs + args, varargs, varkw, defaults, + kwonlyargs, kwdefaults, annotations) ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals') @@ -1214,8 +1218,7 @@ def formatannotationrelativeto(object): return _formatannotation def formatargspec(args, varargs=None, varkw=None, defaults=None, - posonlyargs=(), kwonlyargs=(), kwonlydefaults={}, - annotations={}, + kwonlyargs=(), kwonlydefaults={}, annotations={}, formatarg=str, formatvarargs=lambda name: '*' + name, formatvarkw=lambda name: '**' + name, @@ -1248,17 +1251,12 @@ def formatargspec(args, varargs=None, varkw=None, defaults=None, return result specs = [] if defaults: - firstdefault = len(posonlyargs) + len(args) - len(defaults) - posonly_left = len(posonlyargs) - for i, arg in enumerate([*posonlyargs, *args]): + firstdefault = len(args) - len(defaults) + for i, arg in enumerate(args): spec = formatargandannotation(arg) if defaults and i >= firstdefault: spec = spec + formatvalue(defaults[i - firstdefault]) specs.append(spec) - posonly_left -= 1 - if posonlyargs and posonly_left == 0: - specs.append('/') - if varargs is not None: specs.append(formatvarargs(formatargandannotation(varargs))) else: @@ -1346,8 +1344,7 @@ def getcallargs(*func_and_positional, **named): func = func_and_positional[0] positional = func_and_positional[1:] spec = getfullargspec(func) - (args, varargs, varkw, defaults, posonlyargs, - kwonlyargs, kwonlydefaults, ann) = spec + args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec f_name = func.__name__ arg2value = {} @@ -1356,16 +1353,12 @@ def getcallargs(*func_and_positional, **named): # implicit 'self' (or 'cls' for classmethods) argument positional = (func.__self__,) + positional num_pos = len(positional) - num_posonlyargs = len(posonlyargs) num_args = len(args) num_defaults = len(defaults) if defaults else 0 - n = min(num_pos, num_posonlyargs) - for i in range(num_posonlyargs): - arg2value[posonlyargs[i]] = positional[i] n = min(num_pos, num_args) for i in range(n): - arg2value[args[i]] = positional[num_posonlyargs+i] + arg2value[args[i]] = positional[i] if varargs: arg2value[varargs] = tuple(positional[n:]) possible_kwargs = set(args + kwonlyargs) |