检查Julia中是否存在关键字参数

Con*_*nta 4 julia

我有一个函数收集额外的关键字参数使用...,所以就像function f(args=0; kwargs...).我想检查关键字参数是否a存在kwargs.

我做的可能不是一种优雅的方式,我首先创建一个Dict存储关键字和相应的值kwargs_dict=[key=>value for (key, value) in kwargs],然后我haskey(kwargs_dict, :a)用来检查是否a是dict中的一个键.然后我得到它的价值kwargs_dict[:a].

function f(; kwargs...)
   kwargs_dict = [key=>value for (key, value) in kwargs]
   haskey(kwargs_dict, :a)
   a_value = kwargs_dict[:a]
end

f(args=0, a=2)
> true

f(args=0)
> false
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来检查关键字参数a是否在,kwargs并获取现有关键字参数的值.

Chi*_*olm 6

您只需传递kwargsDict构造函数即可获得kwargs的字典表示.例如:

kwargs_dict = Dict(kwargs)
Run Code Online (Sandbox Code Playgroud)


Dan*_*etz 4

另一种方法是使用命名关键字变量的默认值。默认值是一个特殊值(也称为哨兵值)。当用户提供一个值时,它会覆盖默认值,并且可以轻松检查这一点。nothing是一个常用的值。具体来说,对于问题中的例子:

julia> function g(; a = nothing, kwargs...)
    kwargs_dict = [key=>value for (key, value) in kwargs]
    a != nothing
end
g (generic function with 1 method)
Run Code Online (Sandbox Code Playgroud)

给出功能:

julia> g(args=0, a=2)
true
julia> g(args=0)
false
Run Code Online (Sandbox Code Playgroud)

优点是第一速度 - 默认值关键字参数可以避免kwargs字典,如果可能的话,优化将删除整个字典设置代码。第二个优点可能是可读性(但根据每个人自己的口味)。