函数列表及其在Julia中的描述

函数列表及其在Julia中的描述,julia,Julia,您好,我需要从所有安装的软件包中创建一个所有函数的列表,其中包含“help()”函数中的描述。现在我有了创建已安装软件包列表的代码: z=Array[collect(keys(Pkg.installed()))] p=[z[1],"Base","Core"] 现在在循环中,我可以从包中读取所有函数。但这种错误会发生: whos(p[1]) ERROR: no method whos(ASCIIString,) 如果名称存储为字符串,如何在whos()函数中使用它们 我遇到的第二个问题与此类似

您好,我需要从所有安装的软件包中创建一个所有函数的列表,其中包含“help()”函数中的描述。现在我有了创建已安装软件包列表的代码:

z=Array[collect(keys(Pkg.installed()))]
p=[z[1],"Base","Core"]
现在在循环中,我可以从包中读取所有函数。但这种错误会发生:

whos(p[1])
ERROR: no method whos(ASCIIString,)
如果名称存储为字符串,如何在whos()函数中使用它们

我遇到的第二个问题与此类似


从所有这些函数中,我可以通过help()读取描述并将其存储在数组中。怎么做?

这里有几个问题。首先,正如您所注意到的,函数没有为ascistring参数定义方法。查看的输出表明它需要一个Module类型的参数

julia> methods(whos)
# 4 methods for generic function "whos":
whos(m::Module,pattern::Regex) at show.jl:932
whos() at show.jl:939
whos(m::Module) at show.jl:940
whos(pat::Regex) at show.jl:941

julia> typeof(Base)
Module

julia> whos(Base)
⋮
您有一个带有模块名称的字符串,如“Base”。这就是
eval
的作用。您必须计算模块的名称(作为符号)才能得到实际的模块本身。因此,例如,
eval(symbol(“Base”)
将首先将“Base”转换为符号
:Base
(它仍然只是一个名称,但现在是Julia将识别为标识符的名称),然后对其求值以获得真正的模块库

但是,如果不先导入模块,就无法获取模块(或查看模块内部)。在定义每个模块的名称之前,我们必须导入每个模块。使用
Pkg.installed()
中的每个名称以编程方式执行此操作需要一些时间。这也很棘手,因为import语句的显示位置(必须在顶级范围内)和解析方式(必须在自己的行上,并且不支持在
quote
块中插入)受到限制。因此,不幸的是,这个解决方案不能放入函数中,例如(有一些方法可以解决这个问题:您可以手动
包含每个包的顶级文件,但这需要更多的路径逻辑)

与其将所有内容都打印出来,不如将结果聚合到嵌套字典中,顶级字典将包作为其键,子字典将每个模块的导出名称作为其键

julia> d = Dict{Symbol,Any}()
       for pkg in map(symbol, keys(Pkg.installed()))
         eval(Expr(:import, pkg)) # Manually put the import statement into an Expr
         ks = names(eval(pkg))
         vs = zeros(UTF8String,length(ks))
         for (i,k) in enumerate(ks)
           # packages can export undefined names, which would throw an error
           try
             vs[i] = summary(eval(:($pkg.$k)))
           end
         end
         d[pkg] = Dict(ks,vs)
       end

julia> d[:Gadfly][:plot]
"Function"
由于我们迭代了很多模块,因此我使用
import
而不是
使用
,以防止导出的名称之间发生冲突。这意味着在引用每个导出的名称时,我需要使用PackageName对其进行完全限定。这就是
eval(:($pkg.$k))
正在做的事情,通过。如果一个包导出了一个名称,但没有定义,那么访问它就会抛出一个错误。所以它必须被包装在一个try块中


您可以将
summary
命令更改为您想要的任何命令,但遗憾的是,包无法连接到
help
系统(但),因此通过
sprint(help,…)请求帮助文本
不会提供比摘要更多的信息。

我创建了一个网站,展示了julia函数和示例:以防您只需要最终结果。