2017-08-21 25 views
1

関数にJuliaのキーワード引数があるかどうかを確認する方法はありますか?私はfunがキーワード引数を持つメソッドを持っている場合にtrueを返すようなものを探しています。has_kwargs(fun::Function)関数がJuliaでキーワード引数を持っているかどうか確認してください

function master_fun(foo::Any, fun::Function, ar::Tuple, kw::Tuple) 
    if has_kwargs(fun) 
     fun(ar... ; kw...)  
    else 
     fun(ar...) 
    end 
end 
+0

なぜこのように機能を構築する必要がありますか?私は 'foo'が何であるかは分かりませんが、' ar :: Tuple =()、kw :: Tuple =() 'のデフォルト値はどうでしょうか?楽しみがkwargsを持っているなら、おそらくKwはそれらを保持します(あなたの例で)。 –

+0

私はこれに関する問題を開いています:https://github.com/JuliaLang/julia/issues/20555 –

+0

答えに感謝します。kw =()を使用すると、関数に渡すとBoundsErrorが発生します。 – Maxime

答えて

1

私はあなたが与えられた関数がキーワード引数を持っていることを保証することができるとは思わない:

ハイレベルのアイデアは、機能を構築することです。チェック

f(;x = 3) = println(x) 
f(x) = println(2x) 
f(3) 
    #6 

f(x = 3) 
    #3 

f(3, x = 3) 
    #ERROR: MethodError: no method matching f(::Int64; x=3) 
    #Closest candidates are: 
    # f(::Any) at REPL[2]:1 got unsupported keyword argument "x" 
    # f(; x) at REPL[1]:1 

したがって、f関数にはキーワードがありますか?あなたは与えられた方法だけをチェックすることができます。上記のあなたの例では、あなたが正常にだけ動作するはず

function master_fun(foo, fun::Function, ar::Tuple, kw....) 
    fun(ar... ; kw...) 
end 

にしてください、そしてキーワードはあなただけfunにエラーレポートを残したいそれらを取らない関数に渡された場合、ことに注意してください。それが受け入れられない場合は、fun(ar...; kw...)をtry-catchブロックにラップしようとする可能性があります。

2

基本的に、@Michael K. Borregaardのtry-catchの使用は正解で正式に機能します。

非公式の実装の詳細を見ると、私はfollowngを思い付いた:

haskw(f,tup) = isdefined(typeof(f).name.mt,:kwsorter) && 
    length(methods(typeof(f).name.mt.kwsorter,(Vector{Any},typeof(f),tup...)))>0 

あり、一般的な機能のいずれかの方法上の任意のキーワードの処理があり、そうであれば、見た場合、この関数は、最初に見えます型の特定のタプル。例えば

:非リーフタイプが含まれる場合、それはおそらく動作しないよう

julia> f(x::Int) = 1 
f (generic function with 1 method) 

julia> f(x::String ; y="value") = 2 
f (generic function with 2 methods) 

julia> haskw(f,(Int,)) 
false 

julia> haskw(f,(String,)) 
true 

これは、特定のアプリケーションのためにテストする必要があります。マイケルがコメントしたように、質問の文脈では、ステートメントは次のようになります。

if haskw(fun, typeof.(ar)) 
    ... 
+0

そして、私は忘れてしまった: 'VERSION == v" 0.7.0-DEV.1084 "'(Julia 0.6以上は大丈夫です) –

+1

うわー、あなたは深く掘り下げました:-)これは、この例の文脈では、 'haskw(fun、typeof。(ar))' –

関連する問題