允许函数忽略不支持的关键字参数
Allow function to ignore unsupported keyword arguments
是否有一种允许函数忽略不受支持的关键字参数的好方法?
fopts = [:kw1]
opts = Dict(:kw1=>:symb1, :kw2=>:symb2)
function f(; kw1 = :symb)
return kw1
end
f(;opts...)
会抛出一个 METHOD ERROR
我可以用这样的方式包装它,但我仍然需要知道哪些 kwargs f
会支持?
function f2(fopts; kwargs)
f(; Dict(key=>get(opts, key, 0) for key in fopts)...)
end
我是否缺少解决此问题的方法。如果我认为他们可能需要进行某种查找,那么如果存在性能损失则不会那么大惊小怪。有没有一种很好的方法来询问 kwargs f
以编程方式接受的内容?
这是你想要的吗?
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)
根据@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))...)
但也许有更好的方法
是否有一种允许函数忽略不受支持的关键字参数的好方法?
fopts = [:kw1]
opts = Dict(:kw1=>:symb1, :kw2=>:symb2)
function f(; kw1 = :symb)
return kw1
end
f(;opts...)
会抛出一个 METHOD ERROR
我可以用这样的方式包装它,但我仍然需要知道哪些 kwargs f
会支持?
function f2(fopts; kwargs)
f(; Dict(key=>get(opts, key, 0) for key in fopts)...)
end
我是否缺少解决此问题的方法。如果我认为他们可能需要进行某种查找,那么如果存在性能损失则不会那么大惊小怪。有没有一种很好的方法来询问 kwargs f
以编程方式接受的内容?
这是你想要的吗?
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)
根据@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))...)
但也许有更好的方法