Julia 将字典的键和值导出为变量名和值

Julia 将字典的键和值导出为变量名和值,julia,Julia,如何从字典的键和值创建变量?以下摘录(如PHP)是否可行 julia> d = Dict( "key1" =>111, "key2" =>222, "key3" =>333 ); julia> extract(d) julia> key1, key2, key3 (111,222,333) 键和值都返回迭代器。 collect然后生成一个数组 但是请注意,您通常不需要这样做,只需使用 for (k, v) in d

如何从字典的键和值创建变量?以下摘录(如PHP)是否可行

julia> d = Dict(
    "key1"    =>111,
    "key2"    =>222,
    "key3"    =>333
);
julia> extract(d)
julia> key1, key2, key3
(111,222,333)
键和值都返回迭代器。 collect然后生成一个数组

但是请注意,您通常不需要这样做,只需使用

for (k, v) in d

可以使用
eval
将新变量引入全局范围:

julia> x = 1
1

julia> function testeval()
           eval(:(x = 5))
           return x
       end
testeval (generic function with 1 method)

julia> testeval()
5

julia> x # the global x has changed!
5 
extract
函数可能如下所示:

julia> function extract(d)
           expr = quote end
           for (k, v) in d
               push!(expr.args, :($(Symbol(k)) = $v))
           end
           eval(expr)
           return
       end

julia> extract(d)

julia> key1, key2, key3
(111,222,333)
请注意,每个模块都有自己的全局范围。因此,这将把变量引入定义了
extract
函数的模块范围,也就是说,如果在REPL中定义了
Main
模块,如示例所示


当使用<代码> EVA/COD>时,你应该非常小心,并且首先考虑其他方法,例如David P. Sanders和Dan Getz提到的方法。< /P>查看Maur3的包Parameters.jl()。具体地说,解包Dict就是描述这个操作的方式。太棒了!谢谢你的警告!我目前只在程序开始时使用它从json文件创建全局常量,您的函数很适合这个目的。我把你的修改成了推!(expr.args,:(const$(Symbol(k))=$v))。然后,如果修改常量key1的值,我将得到
警告:重新定义常量key1
julia> function extract(d)
           expr = quote end
           for (k, v) in d
               push!(expr.args, :($(Symbol(k)) = $v))
           end
           eval(expr)
           return
       end

julia> extract(d)

julia> key1, key2, key3
(111,222,333)