如何指定类型签名以在 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},))
得到你想要的。
为了快速找到一些方法的实现我想用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},))
得到你想要的。