summaryrefslogtreecommitdiffstats
path: root/Lib/inspect.py
diff options
context:
space:
mode:
authorDavid Hewitt <1939362+davidhewitt@users.noreply.github.com>2023-03-09 23:06:20 (GMT)
committerGitHub <noreply@github.com>2023-03-09 23:06:20 (GMT)
commit71cf7c3dddd9c49ec70c1a95547f2fcd5daa7034 (patch)
treed171a7559bddd9e560df3f31aa2c2a021555b63e /Lib/inspect.py
parentc6858d1e7f4cd3184d5ddea4025ad5dfc7596546 (diff)
downloadcpython-71cf7c3dddd9c49ec70c1a95547f2fcd5daa7034.zip
cpython-71cf7c3dddd9c49ec70c1a95547f2fcd5daa7034.tar.gz
cpython-71cf7c3dddd9c49ec70c1a95547f2fcd5daa7034.tar.bz2
gh-102378: don't bother stripping `/` from __text_signature__ (#102379)
Diffstat (limited to 'Lib/inspect.py')
-rw-r--r--Lib/inspect.py57
1 files changed, 17 insertions, 40 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 166667c..edc23b0 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -2106,26 +2106,21 @@ def _signature_strip_non_python_syntax(signature):
Private helper function. Takes a signature in Argument Clinic's
extended signature format.
- Returns a tuple of three things:
- * that signature re-rendered in standard Python syntax,
+ Returns a tuple of two things:
+ * that signature re-rendered in standard Python syntax, and
* the index of the "self" parameter (generally 0), or None if
- the function does not have a "self" parameter, and
- * the index of the last "positional only" parameter,
- or None if the signature has no positional-only parameters.
+ the function does not have a "self" parameter.
"""
if not signature:
- return signature, None, None
+ return signature, None
self_parameter = None
- last_positional_only = None
lines = [l.encode('ascii') for l in signature.split('\n') if l]
generator = iter(lines).__next__
token_stream = tokenize.tokenize(generator)
- delayed_comma = False
- skip_next_comma = False
text = []
add = text.append
@@ -2142,35 +2137,18 @@ def _signature_strip_non_python_syntax(signature):
if type == OP:
if string == ',':
- if skip_next_comma:
- skip_next_comma = False
- else:
- assert not delayed_comma
- delayed_comma = True
- current_parameter += 1
- continue
-
- if string == '/':
- assert not skip_next_comma
- assert last_positional_only is None
- skip_next_comma = True
- last_positional_only = current_parameter - 1
- continue
+ current_parameter += 1
if (type == ERRORTOKEN) and (string == '$'):
assert self_parameter is None
self_parameter = current_parameter
continue
- if delayed_comma:
- delayed_comma = False
- if not ((type == OP) and (string == ')')):
- add(', ')
add(string)
if (string == ','):
add(' ')
clean_signature = ''.join(text)
- return clean_signature, self_parameter, last_positional_only
+ return clean_signature, self_parameter
def _signature_fromstr(cls, obj, s, skip_bound_arg=True):
@@ -2179,8 +2157,7 @@ def _signature_fromstr(cls, obj, s, skip_bound_arg=True):
"""
Parameter = cls._parameter_cls
- clean_signature, self_parameter, last_positional_only = \
- _signature_strip_non_python_syntax(s)
+ clean_signature, self_parameter = _signature_strip_non_python_syntax(s)
program = "def foo" + clean_signature + ": pass"
@@ -2269,17 +2246,17 @@ def _signature_fromstr(cls, obj, s, skip_bound_arg=True):
parameters.append(Parameter(name, kind, default=default, annotation=empty))
# non-keyword-only parameters
- args = reversed(f.args.args)
- defaults = reversed(f.args.defaults)
- iter = itertools.zip_longest(args, defaults, fillvalue=None)
- if last_positional_only is not None:
- kind = Parameter.POSITIONAL_ONLY
- else:
- kind = Parameter.POSITIONAL_OR_KEYWORD
- for i, (name, default) in enumerate(reversed(list(iter))):
+ total_non_kw_args = len(f.args.posonlyargs) + len(f.args.args)
+ required_non_kw_args = total_non_kw_args - len(f.args.defaults)
+ defaults = itertools.chain(itertools.repeat(None, required_non_kw_args), f.args.defaults)
+
+ kind = Parameter.POSITIONAL_ONLY
+ for (name, default) in zip(f.args.posonlyargs, defaults):
+ p(name, default)
+
+ kind = Parameter.POSITIONAL_OR_KEYWORD
+ for (name, default) in zip(f.args.args, defaults):
p(name, default)
- if i == last_positional_only:
- kind = Parameter.POSITIONAL_OR_KEYWORD
# *args
if f.args.vararg: