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

时间:2018-08-21 20:31:29

标签: python python-import

假设我有一个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来说明该模块中的代码是否需要它?

4 个答案:

答案 0 :(得分:5)

math.cos中对main.py的引用意味着import mathmain.py是必需的,而不管my_own_module.py是否导入它。它不是多余的,并且不能省略(如果您尝试将其忽略,则会出现错误)。

答案 1 :(得分:3)

import math

除了简单地将一个文件的全文包含到另一个文件中之外,还可以执行其他操作。

它引入了一个名为math的新命名空间,并且该math名称在您的当前命名空间中是已知的。

如果省略

import math

从您的main.py文件中输入命令

foo = math.cos(bar)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

一个好问题。简短的答案是肯定的,如果您在py文件中使用数学函数,则无论模块在其他位置导入多少次,都需要在顶部导入模块。

当我们将一个普通文件放入混音中时,它变得很有趣,我们称其为“ explanation.py”

并假设您的“ main.py”变为“ my_functions.py”并包含一个名为foo的函数:

Editor

,并在my_own_module.py中:

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

最后是exploration.py(新的main())

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

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

但是,值得注意的是,这会将数学从当前名称空间中排除,因此使对数学函数的任何进一步调用都变得无用。