获取模块中定义的函数列表的任何方法?

ane*_*eal 5 julia

是否有任何内省的魔法会给我一个模块中定义的函数列表?

module Foo
  function foo()
    "foo"
  end
  function bar()
    "bar"
  end
end
Run Code Online (Sandbox Code Playgroud)

一些神话般的功能如:

functions_in(Foo)
Run Code Online (Sandbox Code Playgroud)

哪个会回归:[foo,bar]

spe*_*on2 8

这里的问题是,无论是nameswhos 列表导出从一个模块名称.如果你想看到它们,那么你需要做这样的事情:

module Foo

export foo, bar

function foo()
    "foo"
end
function bar()
    "bar"
end
end  # module
Run Code Online (Sandbox Code Playgroud)

在这一点上两者nameswhos 会列出一切.

如果您碰巧在REPL工作并且出于任何原因不想导出任何名称,您可以通过键入以交互方式检查模块的内容Foo.[TAB].请参阅此会话中的示例:

julia> module Foo
         function foo()
           "foo"
         end
         function bar()
           "bar"
         end
       end

julia> using Foo

julia> whos(Foo)
Foo                           Module

julia> names(Foo)
1-element Array{Symbol,1}:
 :Foo

julia> Foo.
bar  eval  foo
Run Code Online (Sandbox Code Playgroud)

不知何故,标签完成正在查找未导出的名称,因此必须有办法让Julia告诉他们.我只是不知道那是什么功能.

编辑


我做了一点挖掘.未导出的函数Base.REPLCompletions.completions似乎有效,正如我们之前使用的REPL会话的延续所示:

julia> function functions_in(m::Module)
           s = string(m)
           out = Base.REPLCompletions.completions(s * ".", length(s)+1)

           # every module has a function named `eval` that is not defined by
           # the user. Let's filter that out
           return filter(x-> x != "eval", out[1])
       end
functions_in (generic function with 1 method)

julia> whos(Foo)
Foo                           Module

julia> names(Foo)
1-element Array{Symbol,1}:
 :Foo

julia> functions_in(Foo)
2-element Array{UTF8String,1}:
 "bar"
 "foo"
Run Code Online (Sandbox Code Playgroud)

  • 您需要使用`names(M,true)`来获取未导出的符号. (6认同)
  • 对于 Julia 1.2 @IsaiahNorton 的有用注释应该是 `names(M, all = true)` (3认同)