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

时间:2014-05-13 07:29:50

标签: julia

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

z=Array[collect(keys(Pkg.installed()))]
p=[z[1],"Base","Core"]

现在在循环中我可以从包中读取所有函数。但是会发生这种错误:

whos(p[1])
ERROR: no method whos(ASCIIString,)

如果将它们存储为字符串,如何在whos()函数中使用名称?

我遇到的第二个问题是类似的。

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

1 个答案:

答案 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, …)获取帮助文本“给你提供比摘要更多的信息。