您好我需要从所有已安装的软件包创建一个列表,其中包含来自“help()”函数的描述。现在我有了这个代码来创建已安装软件包的列表:
z=Array[collect(keys(Pkg.installed()))]
p=[z[1],"Base","Core"]
现在在循环中我可以从包中读取所有函数。但是会发生这种错误:
whos(p[1])
ERROR: no method whos(ASCIIString,)
如果将它们存储为字符串,如何在whos()函数中使用名称?
我遇到的第二个问题是类似的。
从所有这些函数中我可以通过help()读取描述并将其存储在数组中。怎么做?
答案 0 :(得分:4)
这里有几个问题。首先,正如您所注意到的,whos
函数没有为ASCIIString参数定义的方法。查看methods(whos)
的输出显示它需要一个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将识别为名称的名称),然后对其进行评估获得真正的模块库。
但是如果没有先导入模块,你就无法获得一个模块(或查看它内部)。在定义名称之前,我们必须import
每个模块。以编程方式对Pkg.installed()
中的每个名称执行此操作将需要metaprogramming。这也很棘手,因为import语句在它可以出现的位置(必须在顶级范围内)以及如何解析它(必须在它自己的行上,并在quote
内插值时受到限制不支持块)。所以不幸的是,这个解决方案不能放在一个函数中,例如(有很多方法可以解决这个问题:你可以手动include
每个包的顶级文件,但这需要更多的路径逻辑。) p>
我们不是将所有内容打印出来,而是将结果聚合到嵌套字典中,其中顶级字典将包作为其键,而子字典将每个模块的导出名称作为其键。< / p>
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
而不是using
来防止导出名称之间的冲突。这意味着在引用每个导出的名称时,我需要使用PackageName完全限定它。这是eval(:($pkg.$k))
通过interpolation正在做的事情。如果一个包导出一个名称但是未定义它,那么访问它会引发错误。所以它必须包装在try块中。
您可以将summary
命令更改为您想要的任何内容,但遗憾的是,无法将包挂接到help
系统中,因此请求sprint(help, …)
获取帮助文本“给你提供比摘要更多的信息。