【发布时间】:2020-09-26 19:40:08
【问题描述】:
刚开始使用 Julia,但我不知道您如何在任何文档中实际找到函数签名...
例如,假设我想查看 Flux 包的gradient 函数采用哪些参数。
我怎么能找到那个?如果我去通量文档,它主要是英文文档而不是函数签名。 Julia 文档也类似。
感谢任何提示。
【问题讨论】:
-
打开一个repl并输入
?gradient?让你进入帮助模式。
标签: julia
刚开始使用 Julia,但我不知道您如何在任何文档中实际找到函数签名...
例如,假设我想查看 Flux 包的gradient 函数采用哪些参数。
我怎么能找到那个?如果我去通量文档,它主要是英文文档而不是函数签名。 Julia 文档也类似。
感谢任何提示。
【问题讨论】:
?gradient?让你进入帮助模式。
标签: julia
使用methods 函数获取给定函数的所有方法的签名列表。例如:
julia> methods(sin)
# 13 methods for generic function "sin":
[1] sin(x::BigFloat) in Base.MPFR at mpfr.jl:727
[2] sin(::Missing) in Base.Math at math.jl:1197
[3] sin(a::Complex{Float16}) in Base.Math at math.jl:1145
[4] sin(a::Float16) in Base.Math at math.jl:1144
[5] sin(z::Complex{T}) where T in Base at complex.jl:804
[6] sin(x::T) where T<:Union{Float32, Float64} in Base.Math at special/trig.jl:29
[7] sin(x::Real) in Base.Math at special/trig.jl:53
[8] sin(A::LinearAlgebra.Hermitian{var"#s827",S} where S<:(AbstractArray{var"#s828",2} where var"#s828"<:var"#s827") where var"#s827"<:Complex) in LinearAlgebra at /home/bkamins/julia/share/julia/stdlib/v1.5/LinearAlgebra/src/symmetric.jl:922
[9] sin(A::Union{LinearAlgebra.Hermitian{var"#s828",S}, LinearAlgebra.Symmetric{var"#s828",S}} where S where var"#s828"<:Real) in LinearAlgebra at /home/bkamins/julia/share/julia/stdlib/v1.5/LinearAlgebra/src/symmetric.jl:918
[10] sin(D::LinearAlgebra.Diagonal) in LinearAlgebra at /home/bkamins/julia/share/julia/stdlib/v1.5/LinearAlgebra/src/diagonal.jl:576
[11] sin(A::AbstractArray{var"#s828",2} where var"#s828"<:Real) in LinearAlgebra at /home/bkamins/julia/share/julia/stdlib/v1.5/LinearAlgebra/src/dense.jl:836
[12] sin(A::AbstractArray{var"#s828",2} where var"#s828"<:Complex) in LinearAlgebra at /home/bkamins/julia/share/julia/stdlib/v1.5/LinearAlgebra/src/dense.jl:843
[13] sin(J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/bkamins/julia/share/julia/stdlib/v1.5/LinearAlgebra/src/uniformscaling.jl:139
【讨论】:
# 1 method for generic function "gradient": [1] gradient(f, args...) 但它没有说明 f 或 args 的类型。是否只有一个约定 f 是一个函数?
f 和args... 传递,但您不会得到MethodError(这并不意味着您以后不会收到错误,因为f 应该是可调用)。请注意,不仅<:Function 是可调用的。类型也是可调用的(调用它们的构造函数),函子(docs.julialang.org/en/v1/manual/methods/…)也是可调用的。
似乎这个函数缺乏适当的文档,其他答案中描述的标准方法(? 用于帮助 REPL 或方法)将不是很有用。
在这种情况下,我通常会输入一些内容:
@edit gradient(1,2)
这让我想到了函数定义(实际上我可以怀疑第一个参数是一个函数,但运行methods 并没有说明任何事情。
这将打开编辑器,您将看到如下内容:
function gradient(f, args...)
y, back = pullback(f, args...)
return back(sensitivity(y))
end
所以在这个阶段你知道你的函数在做什么。如果不是,您可以搜索pullback,输入?pullback。当您这样做时,您会发现也没有这方面的文档,但它是 Zygote 的一部分。
但是,在 Google 中输入 Zygote.pullback 会将您转到所需的文档:https://fluxml.ai/Zygote.jl/latest/adjoints/
所以这有点骇人听闻。大多数 Julia 库都有很好的文档记录,但如果不是,我总是从 @edit 宏开始工作。
【讨论】:
methods 函数,那么在 REPL 中写入方法号并按 Ctrl-Q 转到所选方法的定义就足够了。关于签名 - 正如我在回答中所评论的那样 - 基本上任何自定义类型的值都可以作为函子进行调用,因此在这里限制签名会出现问题。