【问题标题】:Where to find the signature of a function in Julia?在 Julia 中哪里可以找到函数的签名?
【发布时间】:2020-09-26 19:40:08
【问题描述】:

刚开始使用 Julia,但我不知道您如何在任何文档中实际找到函数签名...

例如,假设我想查看 Flux 包的gradient 函数采用哪些参数。 我怎么能找到那个?如果我去通量文档,它主要是英文文档而不是函数签名。 Julia 文档也类似。

感谢任何提示。

【问题讨论】:

  • 打开一个repl并输入?gradient?让你进入帮助模式。

标签: julia


【解决方案1】:

使用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 是一个函数?
  • 在此您可以将任何值作为fargs... 传递,但您不会得到MethodError(这并不意味着您以后不会收到错误,因为f 应该是可调用)。请注意,不仅&lt;:Function 是可调用的。类型也是可调用的(调用它们的构造函数),函子(docs.julialang.org/en/v1/manual/methods/…)也是可调用的。
【解决方案2】:

似乎这个函数缺乏适当的文档,其他答案中描述的标准方法(? 用于帮助 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 转到所选方法的定义就足够了。关于签名 - 正如我在回答中所评论的那样 - 基本上任何自定义类型的值都可以作为函子进行调用,因此在这里限制签名会出现问题。
猜你喜欢
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多