首页 > 解决方案 > Julia:是否可以将参数字典传递给函数?

问题描述

我有一个要传递给函数的函数参数字典。例如:

function test_function(foo::Int, bar::String)
    #...
end

params = Dict(
    "foo" => 1,
    "bar" => "baz"
)

在 Python 中,我可以像这样将所有参数作为 kwargs 传递:

def test_function(foo: int, bar: str):
    #...

params = {
    "foo": 1
    "bar": "baz"
}

test_function(**params)

但是当我尝试时params...,我收到以下错误:

julia> test_function(params...)
ERROR: MethodError: no method matching test_function(::Pair{String,Any}, ::Pair{String,Any})

有没有办法在 Julia 中做类似的事情?

标签: typesargumentsjuliametaprogrammingkeyword-argument

解决方案


Julia 明确区分了位置参数和关键字参数。为了澄清区别,您可以使用分号将位置参数与关键字参数分开。您可以使用 将对象解包为位置参数或关键字参数...,这称为splatting 运算符

如果要将对象解包为关键字参数,则它需要是对或元组的迭代器。如果您将对象解压缩到位置参数中,则解压缩的元素类型需要匹配函数的方法之一。

这是一个例子:

function foo(x, y; a=1, b=2)
    x + y + a + b
end

t = (1, 2)
d = Dict(:a => 3, :b => 4)
julia> foo(t... ; d...) 
10

但是,请注意,字典中的键(或对/元组的迭代器)必须是符号,以便解包到关键字参数中才能工作:

julia> e = Dict("a" => 3, "b" => 4);

julia> foo(t... ; e...)
ERROR: MethodError: Cannot `convert` an object of type String
to an object of type Symbol

有关详细信息,请参阅手册的可变参数和关键字参数部分。


推荐阅读