如何指定类型签名以在 Julia 中使用 InteractiveUtils.edit 查找特定方法?

How to specify the type signature to find a specific method with InteractiveUtils.edit in Julia?

为了快速找到一些方法的实现我想用InteractiveUtils.edit

例如如果我想看到 methodswith 的实现,我应该能够写出类似 edit(methodswith) 的东西。但是,由于 methodswith 函数有多种方法,我得到:

ERROR: function has multiple methods; please specify a type signature

如何指定类型签名?我知道我可以找到 methods(methodswith) 有哪些方法,给出这样的签名:

[1] methodswith(t::Type; supertypes) in InteractiveUtils at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/InteractiveUtils/src/InteractiveUtils.jl:169

如何将其插入 edit 的调用中?

我知道有 @edit 可以用于一些示例性函数调用。但是,有时仅指定类型会更直接,因为为示例性方法调用构造对象还涉及对有效构造函数的一些调查。

TL;DR:

如何在 Julia 中使用 InteractiveUtils.edit 查找函数的特定方法?

只需将参数类型作为元组在第二个位置参数中传递给 edit

例如 edit(sin, (Int,)) 将为您打开 sin 的定义,该定义与 Int.

类型的一个参数一起使用

请注意,如果您想编辑来自 stdlib 的函数,这可能会失败(对于来自 Base 或非标准库的函数 edit 将正常工作)。

在这种情况下,您必须使用 methods 功能并手动定位文件。例如:

julia> using Statistics

julia> edit(mean, (Vector{Int},)) # this might not work as expected

julia> methods(mean, (Vector{Int},))
# 1 method for generic function "mean":
[1] mean(A::AbstractArray; dims) in Statistics at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Statistics\src\Statistics.jl:132

现在你有了文件名和方法所在的行号,但是路径可能不对,所以还得自己去Julia安装文件夹里找文件。

以下是如何以编程方式检索此信息(假设您已正确指定 args 并且只有一种方法匹配)。先定义一个函数:

function edit_stdlib(fun, args)
    m = methods(fun, args)
    @assert length(m.ms) == 1 # assume we have an exact match
    p = joinpath(Sys.STDLIB, splitpath(string(m.ms[1].file))[end-2:end]...)
    l = m.ms[1].line
    edit(p, l)
end

现在你可以写例如edit_stdlib(mean, (Vector{Int},))得到你想要的。