How do I retrieve the names of function parameters in matlab?

前端 未结 6 1235
面向向阳花
面向向阳花 2020-12-01 12:18

Aside from parsing the function file, is there a way to get the names of the input and output arguments to a function in matlab?

For example, given the following fun

6条回答
  •  不思量自难忘°
    2020-12-01 13:18

    MATLAB offers a way to get information about class metadata (using the meta package), however this is only available for OOP classes not regular functions.

    One trick is to write a class definition on the fly, which contain the source of the function you would like to process, and let MATLAB deal with the parsing of the source code (which can be tricky as you'd imagine: function definition line spans multiple lines, comments before the actual definition, etc...)

    So the temporary file created in your case would look like:

    classdef SomeTempClassName
        methods
            function [value, remain] = divide(left, right)
                %# ...
            end
        end
    end
    

    which can be then passed to meta.class.fromName to parse for metadata...


    Here is a quick-and-dirty implementation of this hack:

    function [inputNames,outputNames] = getArgNames(functionFile)
        %# get some random file name
        fname = tempname;
        [~,fname] = fileparts(fname);
    
        %# read input function content as string
        str = fileread(which(functionFile));
    
        %# build a class containing that function source, and write it to file
        fid = fopen([fname '.m'], 'w');
        fprintf(fid, 'classdef %s; methods;\n %s\n end; end', fname, str);
        fclose(fid);
    
        %# terminating function definition with an end statement is not
        %# always required, but now becomes required with classdef
        missingEndErrMsg = 'An END might be missing, possibly matching CLASSDEF.';
        c = checkcode([fname '.m']);     %# run mlint code analyzer on file
        if ismember(missingEndErrMsg,{c.message})
            % append "end" keyword to class file
            str = fileread([fname '.m']);
            fid = fopen([fname '.m'], 'w');
            fprintf(fid, '%s \n end', str);
            fclose(fid);
        end
    
        %# refresh path to force MATLAB to detect new class
        rehash
    
        %# introspection (deal with cases of nested/sub-function)
        m = meta.class.fromName(fname);
        idx = find(ismember({m.MethodList.Name},functionFile));
        inputNames = m.MethodList(idx).InputNames;
        outputNames = m.MethodList(idx).OutputNames;
    
        %# delete temp file when done
        delete([fname '.m'])
    end
    

    and simply run as:

    >> [in,out] = getArgNames('divide')
    in = 
        'left'
        'right'
    out = 
        'value'
        'remain'
    

提交回复
热议问题