gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:00:48 25 4
gpt4 key购买 nike

嗨,我需要从所有已安装的软件包中创建所有函数的列表,并从“help()”函数中对其进行描述。现在我有这个代码来创建已安装包的列表:

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

现在在循环中,我可以从包中读取所有功能。但是会出现这个错误:
whos(p[1])
ERROR: no method whos(ASCIIString,)

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

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

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

最佳答案

这里有几个问题。首先,正如您所注意到的, 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 将识别为标识符的名称),然后评估它以获得真正的 Module Base。

但是如果不先导入它,你就无法获得一个模块(或查看它的内部)。我们必须 import定义名称之前的每个模块。以编程方式对 Pkg.installed() 中的每个名称执行此操作需要一点 metaprogramming .这也很棘手,因为 import 语句被限制在它可以出现的位置(必须在顶级范围内)以及如何解析它(必须在自己的行上,并且 quote block 内的插值是不支持)。所以不幸的是,这个解决方案不能被放入一个函数中,例如(有一些方法可以解决这个问题:你可以手动 include 每个包的顶级文件手动,但这需要更多的路径逻辑)。

不是将所有内容都打印出来,而是将结果聚合到一个嵌套字典中,其中顶级字典将包作为其键,而子字典将每个模块的导出名称作为其键。
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 block 中。

您可以更改 summary命令可以是任何你想要的,但不幸的是包不能挂接到 help系统(尚未),因此通过 sprint(help, …) 寻求帮助文本不会为您提供比摘要更多的信息。

关于julia - 函数列表及其在 Julia 中的描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23625179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com