gpt4 book ai didi

julia - 如何从出现过的kwargs字段中检索关键字参数?

转载 作者:行者123 更新时间:2023-12-04 11:46:36 25 4
gpt4 key购买 nike

如果我具有f(args...; kwargs...)之类的功能签名,如何从kwargs中获取特定的关键字?单纯输入kwargs.x不起作用:

julia> f(args...; kwargs...) = kwargs.x
f (generic function with 1 method)

julia> f(x=1)
ERROR: type Pairs has no field x
Stacktrace:
[1] getproperty(::Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:x,),Tuple{Int64}}}, ::Symbol) at ./Base.jl:20
[2] #f#7(::Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:x,),Tuple{Int64}}}, ::typeof(f)) at ./REPL[2]:1
[3] (::var"#kw##f")(::NamedTuple{(:x,),Tuple{Int64}}, ::typeof(f)) at ./none:0
[4] top-level scope at REPL[3]:1

这个问题出现在#helpdesk的JuliaLang Slack channel 中。要自动邀请非常有用的 Julia 休闲装,只需填写 https://slackinvite.julialang.org

最佳答案

发生这种情况的原因是,默认情况下,splatted关键字参数未存储在命名元组中。我们可以看到它们的存储方式:

julia> g(;kwargs...) = kwargs
g (generic function with 1 method)

julia> g(a=1)
pairs(::NamedTuple) with 1 entry:
:a => 1

julia> g(a=1) |> typeof
Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:a,),Tuple{Int64}}}

因此,分散的kwarg会存储为某种迭代器对象。但是,我们可以轻松地将 kwargs迭代器转换为NamedTuple,如下所示: (;kwargs...),然后以我们期望的方式访问它,因此您的示例将转换为
julia> f(args...; kwargs...) = (;kwargs...).x
f (generic function with 1 method)

julia> f(x=1, y=2)
1

当然,更惯用的方法是将函数写为
julia> f(args...; x, kwargs...) = x
f (generic function with 1 method)

julia> f(x=1, y=2)
1

但这假设您在编写函数时知道要访问的名称( x)。

一个简短的旁注:如果返回到 g(;kwargs...) = kwargs的示例,我们可以要求返回返回的迭代器对象的字段名,如下所示:
julia> g(x=1, y=2) |> typeof |> fieldnames
(:data, :itr)

嗯,这个 data字段是什么?
julia> g(x=1, y=2).data
(x = 1, y = 2)

啊哈!因此我们实际上可以使用kwargs作为命名元组,即 f(;kwargs...) = kwargs.data.x可以工作,但是我不推荐这种方法,因为它似乎依赖于未记录的行为,因此它可能只是一个实现细节,不能保证一定能做到。在julia版本之间保持稳定。

关于julia - 如何从出现过的kwargs字段中检索关键字参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com