Разрешить функции игнорировать неподдерживаемые аргументы ключевого слова

Есть ли хороший способ разрешить функции игнорировать неподдерживаемые аргументы ключевого слова?

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 принимает программно?


person Alexander Morley    schedule 03.03.2017    source источник
comment
Вы можете определить свою функцию как f(x; kwargs...) = (kwargs = Dict(kwargs); ...) и просто использовать ключевые слова, которые ваша функция должна поддерживать, и игнорировать остальные.   -  person tim    schedule 03.03.2017
comment
если я правильно понял, вы можете искать что-то вроде этого: fopts=methods(methods(f).mt.kwsorter).mt.defs.func.lambda_template.slotnames. я думаю, должен быть чистый способ сделать это.   -  person Gnimuc    schedule 03.03.2017
comment
На самом деле я чувствую, что есть другие варианты использования функции getkwargs ...   -  person Alexander Morley    schedule 03.03.2017


Ответы (2)


Это то, что вы хотите?

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)
person avysk    schedule 03.03.2017

Основываясь на комментариях @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))...)

Но, может быть, есть способ получше

person Alexander Morley    schedule 03.03.2017