[docs]defread_user_function(func:Callable)->FunctionDTO:""" Reads the source code of the user-provided function and extracts its signature and existing docstring (if any). Parameters ---------- func : Callable The user-defined function. Returns ------- FunctionDTO The function signature as a FunctionDTO object. Raises ------ TypeError If func is not a callable object. Examples -------- >>> def example_func(a, b): ... return a + b ... >>> sigDTO = read_user_function(example_func) """ifnotcallable(func):raiseTypeError("Expected a callable function")source_lines=inspect.getsourcelines(func)signature=inspect.signature(func)name=func.__name__return_type=Noneifsignature.return_annotationisinspect.Signature.emptyelsestr(signature.return_annotation)inputs=[]forparam_name,paraminsignature.parameters.items():param_type=Noneifparam.annotationisinspect.Parameter.emptyelsestr(param.annotation)inputs.append((param_name,param_type))returnFunctionDTO(name=name,output=return_type,inputs=inputs,src=source_lines)