MCPcopy Index your code
hub / github.com/python/cpython / parse_parameter

Method parse_parameter

Tools/clinic/libclinic/dsl_parser.py:878–1128  ·  view source on GitHub ↗
(self, line: str)

Source from the content-addressed store, hash-verified

876 self.parse_parameter(param)
877
878 def parse_parameter(self, line: str) -> None:
879 assert self.function is not None
880
881 if not self.expecting_parameters:
882 fail('Encountered parameter line when not expecting '
883 f'parameters: {line}')
884
885 match self.parameter_state:
886 case ParamState.START | ParamState.REQUIRED:
887 self.to_required()
888 case ParamState.LEFT_SQUARE_BEFORE:
889 self.parameter_state = ParamState.GROUP_BEFORE
890 case ParamState.GROUP_BEFORE:
891 if not self.group:
892 self.to_required()
893 case ParamState.GROUP_AFTER | ParamState.OPTIONAL:
894 pass
895 case st:
896 fail(f"Function {self.function.name} has an unsupported group configuration. (Unexpected state {st}.a)")
897
898 # handle "as" for parameters too
899 c_name = None
900 m = re.match(r'(?:\* *)?\w+( +as +(\w+))', line)
901 if m:
902 c_name = m[2]
903 line = line[:m.start(1)] + line[m.end(1):]
904
905 try:
906 ast_input = f"def x({line}\n): pass"
907 module = ast.parse(ast_input)
908 except SyntaxError:
909 fail(f"Function {self.function.name!r} has an invalid parameter declaration: {line!r}")
910
911 function = module.body[0]
912 assert isinstance(function, ast.FunctionDef)
913 function_args = function.args
914
915 if len(function_args.args) > 1:
916 fail(f"Function {self.function.name!r} has an "
917 f"invalid parameter declaration (comma?): {line!r}")
918
919 is_vararg = is_var_keyword = False
920 if function_args.vararg:
921 self.check_previous_star()
922 self.check_remaining_star()
923 is_vararg = True
924 parameter = function_args.vararg
925 elif function_args.kwarg:
926 # If the existing parameters are all positional only or ``*args``
927 # (var-positional), then we allow ``**kwds`` (var-keyword).
928 # Currently, pos-or-keyword or keyword-only arguments are not
929 # allowed with the ``**kwds`` converter.
930 has_non_positional_param = any(
931 p.is_positional_or_keyword() or p.is_keyword_only()
932 for p in self.function.parameters.values()
933 )
934 if has_non_positional_param:
935 fail(f"Function {self.function.name!r} has an "

Callers 1

state_parameterMethod · 0.95

Calls 15

to_requiredMethod · 0.95
check_previous_starMethod · 0.95
check_remaining_starMethod · 0.95
is_keyword_onlyMethod · 0.95
parse_converterMethod · 0.95
failFunction · 0.90
ParameterClass · 0.90
DetectBadNodesClass · 0.85
anyFunction · 0.50
compileFunction · 0.50
matchMethod · 0.45

Tested by

no test coverage detected