How can I validate a function handle as an input argument?

[亡魂溺海] 提交于 2019-12-06 06:33:52

问题


I have a class that has a function handle as one of its properties.

classdef MyClass
    properties
        hfun %function handle 
    end

    methods
        function obj = Myclass(hfun,...)
            %PROBLEM: validate that the input argument hfun is the right kind of function
            if ~isa(hfun,'function_handle') || nargin(hfun)~=1 || nargout(hfun)~=1
                error('hfun must be a function handle with 1 input and 1 output');
            end
            obj.hfun = hfun;
        end
    end
end

I'd like to make sure that the input argument hfun is a function handle with 1 input and 1 output, otherwise it should error. If I could get even more specific I'd like this function to take an Nx3 array as an input argument and return an Nx3 array as the output argument.

The above code works for built-in functions like f = @sqrt but if I try to put in an anonymous function like f = @(x) x^(0.5), then nargout(hfun) is -1 because it treats anonymous functions as [varargout] = f(x). Furthermore if you input the handle to a class method like f = @obj.methodFun, then it converts the function to the form [varargout] = f(varargin) which returns -1 for both nargin and nargout.

Has anyone figured out a convenient way to validate a function handle as an input argument? Independent of what kind of function handle it's from?


回答1:


The closest I've come to validating the inputs and outputs of a function handle is inside a try/catch statement.

function bool = validateFunctionHandle(fn)
    %pass an example input into the function
    in = blahBlah; %exampleInput
    try
        out = fn(in);
    catch err
        err
        bool = false;
        return;
    end

    %check the output argument
    if size(out)==correctSize and class(out)==correctType
        bool=true;
    else
        bool=false;
    end
end



回答2:


You can use class to tell whether a variable is a function handle but there is no easy way to validate the type of input and output because MATLAB is loosely typed and a variable can contain anything so long as it can figure out how to interpret the commands at runtime. As Mohsen pointed out, you can also functions to get more info but it won't help you too much.

Here is the closest I think you can get:

fn = @(x,y) x + x*2

if strcmpi(class(fn), 'function_handle')
    functionInfo = functions(fn)
    numInputs =  nargin(fn)
    numOutputs = nargout(fn)
end

If speed is not an issue, you could create a class with member functions run that runs the function and geInfo that returns whatever details you need. Then you always pass a class to you function that will have the info built into it. However, this will be slow and inconvenient.



来源:https://stackoverflow.com/questions/19013934/how-can-i-validate-a-function-handle-as-an-input-argument

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!