使用字符串选择函数和/或变量(Julia)

时间:2018-12-11 16:35:17

标签: julia

假设我有两个功能:

function func_one(data, pars):
    ---
end

function func_two(data, pars):
    ---
end

每个函数都需要数据和参数,但不一定是同一维,因此我创建

data_one = []
data_two = []
pars_one = []
pars_two = []

接下来,我有一个字符串变量,例如name,可以是“一个”或“两个”,并且将用于选择稍后我将使用哪种类型的三元组(func,data,pars)。称呼一切。例如

name = "one"

然后我有

func = "func_" * name
data = "data_" * name
pars = "pars_" * name 

然后我想称这样的组合

MainFunction(func,data,pars)

实际上,我有两个以上的可能的三元组(func,data,pars)。当然,目前这还行不通,因为(func,data,pars)是字符串,但是我希望它们指向相应的函数和变量。我想这样做,以便用户可以只更改字符串名称,然后适当选择其他所有内容。如何执行此操作(在Julia中)?

2 个答案:

答案 0 :(得分:2)

您正在沿着评估字符串的思路进行思考,这始终是一个坏主意。相反,应专注于创建适当的结构。如果您确实必须使用字符串(即使最好将其视为数组),也可以将所述字符串用作字典中的键,例如:

funcs = Dict{String, Function}();   #> Dict{String,Function} with 0 entries
funcs["one"] = (data, pars) -> print("Doing stuff with provided data and pars");
funcs["two"] = (data, pars) -> print("Doing something else with provided data and pars");

data = Dict{String, Any}();    #> Dict{String,Any} with 0 entries
data["one"] = [1 2 3 4 5];
data["two"] = [1;2;3;4;5];

pars = Dict{String, Any}();    #> Dict{String,Any} with 0 entries
pars["one"] = "Use turbo encabulator model";
pars["two"] = "Use encaboturbolation semantics";

# Use it
funcs["one"](data["one"], pars["one"])    #> prints "Doing stuff with provided data and pars"

从上面可以看到,将函数创建为“ lambdas”可轻松将其分配给字典元素。如果需要多行功能,可以使用begin ... end块来实现。

答案 1 :(得分:2)

虽然Tasos是正确的,通常您应该为此目的使用函数,lambda或数据结构,但我理解您的问题实际上是关于元编程的。这是操作方法:

让我们从准备函数和变量开始:

from logging.handlers import SocketHandler as _SocketHandler

class DjangoSocketHandler(_SocketHandler):
    def emit(self, record):
        if hasattr(record, 'request'):
            record.request = None
        return super().emit(record)

现在,按照您的问题,我们假设实际参数的名称保留在function main_fun(f,data,pars) println([f(),data,pars]) end function f1() return "hello from f1" end data1 = "I'm data1" pars1 = "I'm pars1" s中-我们需要将它们转换为String s:

Symbol

创建代码(注意插值的使用):

f_name, data_name, pars_name = Symbol.(("f1","data1","pars1"))

现在让事情开始发展(这是示例控制台输出):

code = :(main_fun($f_name,$data_name,$pars_name))

请注意,julia> Main.eval(code) ["hello from f1", "that is data1", "that is pars1"] 需要编译代码,这需要时间。