允许函数忽略不支持的关键字参数。

7
有没有一种好的方法让函数忽略不支持的关键字参数?
fopts = [:kw1]
opts = Dict(:kw1=>:symb1, :kw2=>:symb2)

function f(; kw1 = :symb)
    return kw1
end

f(;opts...)会抛出一个METHOD ERROR

我可以像这样包装它,但我仍然需要知道f支持哪些kwargs参数?

function f2(fopts; kwargs)
    f(; Dict(key=>get(opts, key, 0) for key in fopts)...)
end

我是否错过了绕过此问题的方法?如果有一些查找,我想象中可能需要一些性能损失,并不太担心。有没有一种良好的方式通过编程来查询kwargs f接受什么参数。


你可以将函数定义为 f(x; kwargs...) = (kwargs = Dict(kwargs); ...),然后只使用你的函数应该支持的关键字,忽略其余的。 - tim
如果我理解正确,您可能正在寻找类似于这样的内容:fopts=methods(methods(f).mt.kwsorter).mt.defs.func.lambda_template.slotnames。我猜肯定有一种简洁的方法来实现这个。 - Gnimuc
确实,我觉得getkwargs函数还有其他用途... - Alexander Morley
2个回答

9

Is this what you want?

function g(; kw1 = :a, kw2 = :b, _whatever...)
    return (kw1, kw2)
end

现在它的工作方式是这样的:
julia> g()
(:a,:b)

julia> g(kw1 = :c)
(:c,:b)

julia> g(kw2 = :d)
(:a,:d)

julia> g(kw2 = :e, kw1 = :f, kw3 = :boo)
(:f,:e)

0

根据@tim和@Gnimuc的评论,可以定义这两个函数:

getkwargs(f) = methods(methods(f).mt.kwsorter).mt.defs.func.lambda_template.slotnames[4:end-4]

usesupportedkwargs2(f::Function, args...; kwargs...) = f(args...; Dict(key=>get(Dict(kwargs),key,0) for key in getkwargs(f))...)

但也许有更好的方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接