假设我有两个功能:
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中)?
答案 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"]
需要编译代码,这需要时间。