julia - 检查一个函数在 Julia 中是否有关键字参数

标签 julia metaprogramming

有没有办法在 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/

相关文章:

linux - 检测 CPU 功能支持(例如 sse2、fma4 等)

c# - 有没有像这样的基于元数据声明生成 UI 的库>>?

ruby - 如何存储应用程序的首选项?

python - 在Python中销毁Singleton对象

c++ - C++中的模板工厂模式

c++ - 在创建 C++ 枚举和依赖数据结构时如何避免重复自己?

tuples - 如何在 Julia 中填充元组?

include - julia: `include` 文件的推荐方法:顶级文件中的包含列表或嵌套包含?

multithreading - Julia:宏线程和并行

julia - 在类型定义中声明数组属性的大小