【问题标题】:Julia Circular Inclusion朱莉娅圆形包含
【发布时间】:2020-09-15 21:05:42
【问题描述】:

我的目标:对于一个项目,能够包含本地文件(同一个项目的一部分,完全相同的目录),很简单,可能是循环的。

在 Julia 中,假设我有文件:

FILE1.jl

module A

include("FILE2.jl")
using B

# Type annotations that need types from B

end

文件2.jl

module B

include("FILE1.jl")
using A

# Type annotations that need types from A

end

在 Julia (>v1) 中,这会导致无限循环。我已经尝试将文件添加到我的加载路径,以便我可以直接使用 using 或 import,但它仍然找不到它们。

假设循环依赖,将文件包含在同一目录中的“朱利安”方式是什么,并且是同一项目的一部分?我看到很多帖子都说“如果是这种情况,你的代码可能是错误的”,我认为这只是一个愚蠢的说法。

【问题讨论】:

  • 澄清一下:我认为您在这里混淆了两个概念。模块本质上是命名空间。它们与文件没有多大关系:单个 Julia 源文件可以定义多个模块,或者单个 Julia 模块可以将其实现拆分为多个文件。我提到这一点是因为您似乎习惯了 Python,其中 (AFAIU) 大多数时间在源文件和模块之间存在直接的、一对一的映射。 docs.julialang.org/en/v1/manual/noteworthy-differences 中提到了这一点以及 Python 和 Julia 之间的其他差异
  • 您能解释一下为什么会出现这种循环依赖吗?换句话说,两个文件/模块以哪种方式相互依赖?
  • 我更新了格式化问题,以更好地反映我正在尝试做的事情。如果我在当前环境中注册了我的包,是否可以在不使用 include 的情况下找到它?
  • 作为更新 - 我不希望每个文件包含多个模块的文件。最终,我想要一个模块来定义一个或几个抽象类型,然后定义一些扩展这种类型的具体结构以及一些方法。具体结构的字段可能依赖于其他模块中定义的抽象类型,并且可能是循环的。

标签: julia


【解决方案1】:

一种常见的结构是将所有includes 放在一个位置,即项目的根目录。 Flux.jl 就是一个很好的例子。

如果项目很大,人们使用module 来细分他们的项目,但你不需要!一个大型项目可以由一个模块组成。我建议只将一块代码拆分为自己的模块,如果它作为一个孤立的整体是有意义的。 (其他人可能对此有不同的看法!)但是由于您询问循环引用,听起来单个模块更适合您的情况。

模块不能包含循环引用:

# will not work
module A
    import ..B: y
    x = 1
end
module B
    import ..A: x
    y = 1
end

这不是函数的问题:

function a(x)
    if x < 1
        1
    else
        b(x-1) * 2
    end
end

function b(x)
    a(x)
end

b(10)

函数可以使用在其自己的定义之后定义的类型、函数、常量、模块。

【讨论】:

  • 我还是迷路了。在 FILE1.jl 中,我定义了一些基本的抽象类型,它们都包含在模块 A 中。现在,我还有 FILE2.jl。 FILE2.jl 没有模块(尽管这无关紧要),只有 Julia 代码。在 FILE2.jl 中,我想定义一个从模块 A 扩展这些抽象类型之一的具体类型。最后,我还想在 FILE1.jl 中包含 FILE2.jl。我不想直接将 FILE2.jl 存储在 FILE1.jl 中。
  • 这是个好策略!在这种情况下,您只是将模块 A 的代码拆分为多个文件。所以内部模块A(end之前),你做include("FILE2.jl")
  • 您应该看到include(path) 为“从path 获取文本,并将其粘贴到此处”。在 Python 中,文件夹结构等于模块结构,在 Julia 中,您自己编写模块结构(如果需要),include 只是一个复制粘贴命令。
  • 感谢您的帮助。如何在没有 include("FILE1.jl") 的情况下安全地将抽象类型提供给 FILE2.jl 的范围,这会调用 include("FILE2.jl")、inf 循环..?
  • 文件不引入范围,您应该真正将include 视为复制粘贴命令。这就是为什么你需要 include inside 模块:这使得抽象类型在文件 2 中可用。
猜你喜欢
  • 2014-02-04
  • 2018-11-27
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2017-01-15
  • 2016-02-18
  • 2021-11-04
相关资源
最近更新 更多