如何知道哪个模块导出某个函数

How to know which module exports a certain function

我正在学习这个 Flux.jl 教程并遇到了一个叫做 Chain 的东西。

m = Chain(Dense(10, 5, relu), Dense(5, 2), softmax)

它不是从任何使用的模块导入的,也没有使用命名空间,所以我不知道它属于哪个模块。虽然我设法发现我属于 Flux 包,但我想知道是否有一种通用的方法可以在脚本中解决这个问题。

要找出特定函数的来源,可以使用 parentmodule 函数:

julia> parentmodule(Chain)
Flux

在 Julia 文档中阅读更多内容:https://docs.julialang.org/en/v1/base/base/#Base.parentmodule

请注意,正如文档所述,parentmodule(<function>) 仅 returns 包含 first 函数定义的模块,这不一定是我们关心的一个。在这种情况下,这无关紧要,因为 Chain 仅在 Flux 中有定义,但有时一个函数在多个包中都有定义,应用哪个包取决于参数的类型。

parentmodule 也可以帮助你,如果你将你的参数类型传递给它(例如 parentmodule(Chain, (Dense, Dense, Function)) 这里),但我通常只倾向于使用 @which宏观:

julia> @which Chain(Dense(10, 5, relu), Dense(5, 2), softmax)
Chain(xs...) in Flux at /home/Sundar/.julia/packages/Flux/BPPNj/src/layers/basic.jl:33

输出稍显嘈杂,但它会告诉您应用了函数的哪个特定方法、它来自哪个模块以及您可以找到方法定义的确切位置。