有没有办法在 Julia 中检查一个函数是否有关键字参数?我正在寻找类似 has_kwargs(fun::Function)
的东西,如果 fun 有一个带有关键字参数的方法,它会返回 true。
高层的想法是构建一个函数:
function master_fun(foo::Any, fun::Function, ar::Tuple, kw::Tuple)
if has_kwargs(fun)
fun(ar... ; kw...)
else
fun(ar...)
end
end
最佳答案
基本上,@Michael K. Borregaard 关于使用 try-catch 的建议是正确的并且正式有效。
查看非官方的实现细节,我得出了以下结论:
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))
...
关于julia - 检查一个函数在 Julia 中是否有关键字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45789615/