在 Python 中导出模块组件

Export module components in Python

在 Julia 中,可以导出模块的函数(或变量、结构等),之后可以在没有命名空间的情况下在另一个脚本中调用它(一旦导入)。例如:

# helpers.jl
module helpers

function ordinary_function()
# bla bla bla
end

function exported_function()
# bla bla bla
end

export exported_function()
end
# main.jl
include("helpers.jl")
using .helpers

#we have to call the non-exported function with namespace
helpers.ordinary_function()

#but we can call the exported function without namespace
exported_function()

此功能在 Python 中可用吗?

在 Python 中导入比这更容易:

# module.py
def foo(): pass

# file.py
from module import foo
foo()

# file2.py
from file import foo
foo()

这也适用于 classes。


在Python中你也可以这样做:

import module
# You have to call like this:
module.foo()

导入模块时,模块导入的所有函数都被视为模块的一部分。使用以下示例:

# file.py
import module

# file2.py
import file
file.module.foo()
# or...
from file import module
module.foo()
# ...or...
from file.module import foo
foo()

请注意,在 Python 中不需要 export

查看 documentation:Python 中不存在 export 关键字。

在 Julia 中,两个模块可以 export 相同的功能,Julia 会自动检测到这样的问题,即即使你 export 它们也不会相互覆盖:

julia> module A
       export x
       x() = "a"
       end
Main.A

julia> module B
       export x
       x() = "b"
       end
Main.B

julia> using .A, .B

julia> x()
WARNING: both B and A export "x"; uses of it in module Main must be qualified

这就是为什么在 Julia 中通常的做法是 using 而不是 import

在 Python 中,在生产代码中执行等效操作被认为是一种不好的做法。

作为旁注:Julia 和 Python 之间的另一个相关区别是,在 Julia 中,module 概念与 files/directory 结构分离。您可以在一个文件中包含多个模块,也可以将多个文件组成一个模块。