Как указать сигнатуру типа, чтобы найти конкретный метод с InteractiveUtils.edit в Юлии? - PullRequest
0 голосов
/ 27 января 2019

Чтобы быстро найти реализацию некоторых методов, я хотел бы использовать 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?

Iзнаю, что есть @edit, который я мог бы использовать с некоторым примерным вызовом функции.Однако иногда было бы более просто просто указать типы, потому что построение объектов для примерного вызова метода также включает в себя некоторое исследование для допустимых конструкторов.

TL; DR:

Как найти определенный метод функции с InteractiveUtils.edit в Юлии?

1 Ответ

0 голосов
/ 27 января 2019

Просто передайте типы аргументов как кортеж во втором позиционном аргументе 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},)) чтобы получить то, что вы хотите.

...