def signature_from_str(signature: str) -> inspect.Signature: """Create a Signature object from string.""" code = 'def func' + signature + ': pass' module = ast.parse(code) function = cast(ast.FunctionDef, module.body[0]) # type: ignore return signature_from_ast(function, code)
def signature_from_str(signature: str) -> inspect.Signature: """Create a Signature object from string.""" module = ast.parse('def func' + signature + ': pass') definition = cast(ast.FunctionDef, module.body[0]) # type: ignore # parameters args = definition.args defaults = list(args.defaults) params = [] if hasattr(args, "posonlyargs"): posonlyargs = len(args.posonlyargs) # type: ignore positionals = posonlyargs + len(args.args) else: posonlyargs = 0 positionals = len(args.args) for _ in range(len(defaults), positionals): defaults.insert(0, Parameter.empty) if hasattr(args, "posonlyargs"): for i, arg in enumerate(args.posonlyargs): # type: ignore if defaults[i] is Parameter.empty: default = Parameter.empty else: default = ast_unparse(defaults[i]) annotation = ast_unparse(arg.annotation) or Parameter.empty params.append(Parameter(arg.arg, Parameter.POSITIONAL_ONLY, default=default, annotation=annotation)) for i, arg in enumerate(args.args): if defaults[i + posonlyargs] is Parameter.empty: default = Parameter.empty else: default = ast_unparse(defaults[i + posonlyargs]) annotation = ast_unparse(arg.annotation) or Parameter.empty params.append(Parameter(arg.arg, Parameter.POSITIONAL_OR_KEYWORD, default=default, annotation=annotation)) if args.vararg: annotation = ast_unparse(args.vararg.annotation) or Parameter.empty params.append(Parameter(args.vararg.arg, Parameter.VAR_POSITIONAL, annotation=annotation)) for i, arg in enumerate(args.kwonlyargs): default = ast_unparse(args.kw_defaults[i]) or Parameter.empty annotation = ast_unparse(arg.annotation) or Parameter.empty params.append(Parameter(arg.arg, Parameter.KEYWORD_ONLY, default=default, annotation=annotation)) if args.kwarg: annotation = ast_unparse(args.kwarg.annotation) or Parameter.empty params.append(Parameter(args.kwarg.arg, Parameter.VAR_KEYWORD, annotation=annotation)) return_annotation = ast_unparse(definition.returns) or Parameter.empty return inspect.Signature(params, return_annotation=return_annotation)
def signature_from_str(signature: str) -> inspect.Signature: """Create a Signature object from string.""" module = ast.parse('def func' + signature + ': pass') definition = cast(ast.FunctionDef, module.body[0]) # type: ignore # parameters args = definition.args params = [] if hasattr(args, "posonlyargs"): for arg in args.posonlyargs: # type: ignore annotation = ast_unparse(arg.annotation) or Parameter.empty params.append( Parameter(arg.arg, Parameter.POSITIONAL_ONLY, annotation=annotation)) for i, arg in enumerate(args.args): if len(args.args) - i <= len(args.defaults): default = ast_unparse(args.defaults[-len(args.args) + i]) else: default = Parameter.empty annotation = ast_unparse(arg.annotation) or Parameter.empty params.append( Parameter(arg.arg, Parameter.POSITIONAL_OR_KEYWORD, default=default, annotation=annotation)) if args.vararg: annotation = ast_unparse(args.vararg.annotation) or Parameter.empty params.append( Parameter(args.vararg.arg, Parameter.VAR_POSITIONAL, annotation=annotation)) for i, arg in enumerate(args.kwonlyargs): default = ast_unparse(args.kw_defaults[i]) or Parameter.empty annotation = ast_unparse(arg.annotation) or Parameter.empty params.append( Parameter(arg.arg, Parameter.KEYWORD_ONLY, default=default, annotation=annotation)) if args.kwarg: annotation = ast_unparse(args.kwarg.annotation) or Parameter.empty params.append( Parameter(args.kwarg.arg, Parameter.VAR_KEYWORD, annotation=annotation)) return_annotation = ast_unparse(definition.returns) or Parameter.empty return inspect.Signature(params, return_annotation=return_annotation)