嵌套 Python 模块导入的最佳实践

Best practice for nested Python module imports

假设我有一个 Python 模块 "main.py":

import math           # from the standard Python library
import my_own_module

...

foo = math.cos(bar)

而且我还需要在"my_own_module.py"中导入标准数学模块:

import math

...

baz = math.sin(qux)

在这种情况下,我认为"main.py"中的import math是多余的,可以省略。

这种情况下的最佳做法是什么:

  1. 从 "main.py" 中省略 import math 因为它是多余的?或者,
  2. 在 "main.py" 中保留 import math 以阐明该模块中的代码需要它?

main.py中对math.cos的引用意味着import mathmain.py中是必需的,无论my_own_module.py是否导入它。它不是多余的,也不能省略(如果你试图省略它,你会得到一个错误)。

这不像 C++ 中的 #include。导入 不是 可选。导入模块需要能够引用其内容。对于执行此操作的每个文件都是如此。

import math

做一些事情 else 而不是简单地 将一个文件的全文包含到另一个文件中

它引入了一个名为 math 的新 命名空间 ,并且这个 math 名称将在您的 当前命名空间中为人所知

如果省略

import math

从您的 main.py 文件,您的命令

foo = math.cos(bar)

变为 非法 ,因为 math 符号在 main.py 命名空间中不会(被识别)。

好问题。简短的回答是肯定的,如果你在 py 文件中使用数学函数,那么你需要在顶部导入模块,不管它在其他地方导入了多少次。

当我们将第三个文件放入混音时会变得有趣,让我们称之为 "explanation.py"

并假设您的 "main.py" 变为 "my_functions.py" 并包含一个名为 foo:

的函数
#my_functions.py
import math
import my_own_module
def foo(bar):
    return math.cos(bar)

并在 my_own_module.py 中:

#my_own_module.py
import math
def bar(foo):
    return math.sin(foo)

最后 explanation.py (new main())

#main.py
import my_functions
import my_own_module
bar = my_functions.foo(10)
foo =  my_own_module.bar(10)
print(foo)
print(bar)

请注意,如果您调用从另一个文件导入的函数,则无需添加数学运算。我希望这可以使您的查询更加清晰:)

然而,可能值得注意的是,这会将数学从当前命名空间中排除,因此导致对数学函数的任何进一步调用都无用。