gpt4 book ai didi

Julia: `import` 和 `using` 的用例

转载 作者:行者123 更新时间:2023-12-03 15:39:08 25 4
gpt4 key购买 nike

所以我读了documentation for using and import 在 Julia 。然而,这并没有告诉我在实践中我应该如何使用这两个语句(并且,鉴于缺乏正交性,这不太容易)。
举个例子:让我们在 "myfile.jl" 中添加以下简单代码:

module MyModule
f() = 1
export f
end
import .MyModule # or: using .MyModule
  • 如果我使用 import在最后一行,然后是 f未导出到 Main命名空间。但是,当我更改 "myfile.jl" (例如修改 f 的返回值)然后重新 include它,函数被替换(这是我希望的行为)。 (请注意,我可以明确地 import .MyModule: f ,但这会引入不必要的冗余;而且,现实生活中的情况将涉及一长串名称很长的函数。好吧,我也可以编写一个使用 names(Main.MyModule) 的宏,但我不知何故觉得这应该更简单。)
  • 如果我替换 import通过 using ,然后反过来:f现在已导出,但现在更改模块中的任何内容都需要重新启动 Julia 解释器。
  • 使用importusing仅导出 f() 的第一个版本到主命名空间:当我更新代码时,只使用第一个返回值。

  • 所以我的问题不是关于这两个语句的行为 importusing ,在链接页面中记录(如果没有解释),但关于这些背后的意图。当一个就足够时,为什么要两个声明?为什么其中之一忽略所有 export指令?在哪种情况下,我应该在实践中使用每个语句?
    (版本是 1.1.0。另外,它运行在一个无法轻松访问 Pkg 的系统上,所以我还没有尝试 Revise。)

    最佳答案

    Julia 的约定是使用 using PackageName除非您有特定的理由不这样做。
    这种语言设计决策只是出于用户的舒适度。 Julia 使用多重分派(dispatch),并且通常打包对类型化参数进行操作的导出函数(但是这些通常是 abstract 类型,因此函数功能不受限制)。
    通过这种设计,所有实现它们的函数和方法都可以在同一个命名空间中,因为它们在特定于它们的包的参数类型上有所不同。因此,using给命名空间带来一个覆盖现有方法实现的包是非常罕见的(然后 Julia 会报告一个警告)。这个过程还由包作者通过使用 export 来控制。关键词。
    我认为这对您来说看起来很奇怪,因为您已经习惯了 Python 之类的语言。举个例子numpy具有与默认函数完全相同的函数名称,并且没有好的方法可以将它们命名为不同的名称(例如,尝试考虑一个名为 sin 的函数的好的替代方法 :-))。因此,在 Python 中,您总是需要将函数导入到它们自己的命名空间中,可能使用别名,例如 import numpy as np。 .在对这两种语言有几年的经验之后,我会说 Julia 的方式很自然,而 Pytonish 的方式很奇怪 :-)
    关于import以及将单个函数从包中引入命名空间的可能性,我认为这是发生名称冲突情况的解决方法。如果您想将新方法实现添加到其他包(例如为 + 运算符定义新含义),您还需要显式执行此操作。除此之外,您只需键入 using永不回头。

    关于Julia: `import` 和 `using` 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64260563/

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