【问题标题】:Check if keyword arguments exist in Julia检查 Julia 中是否存在关键字参数
【发布时间】:2016-02-02 15:15:34
【问题描述】:

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

我所做的可能不是一种优雅的方式,我首先创建一个Dict 来存储关键字和对应的值kwargs_dict=[key=>value for (key, value) in kwargs],然后我使用haskey(kwargs_dict, :a) 来检查a 是否是字典中的一个键。然后我通过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

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

【问题讨论】:

    标签: julia


    【解决方案1】:

    您可以将kwargs 传递给Dict 构造函数以获取kwargs 的字典表示。例如:

    kwargs_dict = Dict(kwargs)
    

    【讨论】:

    • 感谢这是一种优雅的方式来制作字典。
    【解决方案2】:

    另一种方法是使用命名关键字变量的默认值。默认值是一个特殊值(a.k.a sentinel value)。当用户提供一个值时,它会覆盖默认值,这很容易检查。 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)
    

    提供功能:

    julia> g(args=0, a=2)
    true
    julia> g(args=0)
    false
    

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

    【讨论】:

    • 在许多情况下这是一个好方法,但请务必注意类型不稳定性:` #= good =# f(;a::Int=0) = a; g(use::Bool) = 使用? f(a=1) : f(); @code_warntype g(true); #= 不好 =# f(;a=nothing) = a==nothing ? 0:一个; g(use::Bool) = 使用? f(a=1) : f(); @code_warntype g(true) `
    【解决方案3】:

    我的两分钱: 你也可以定义

    function f(; kwargs...)
        keys = [k for (k, v) ∈ kwargs]
        :a ∈ keys
    end
    

    如果你只是想在没有提供 kwarg 的情况下提供一个值,你也可以这样做

    function f(; kwargs...)
        a = get(kwargs, :a, "my default value for a")
    end
    

    这让你可以

    julia> f(ab = "a")
    "my default value for a"
    
    julia> f(a = "a")
    "a"
    

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2020-04-11
      • 1970-01-01
      相关资源
      最近更新 更多