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

4
假设我有一个名为“main.py”的Python模块:
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
"不是一个选项,导入不是多余的。" - Markus Unterwaditzer
4个回答

5

main.py中对math.cos的引用意味着无论my_own_module.py是否导入它,都需要在main.py中导入import math。这不是多余的,也不能省略(如果你试图省略它,会出现错误)。


3
import math

除了简单地将一个文件的全部文本包含到另一个文件中,它还会做一些其他的事情。

它会引入一个名为math的新命名空间,并且这个math名称将在您的当前命名空间中得到认可。

如果您省略了

import math

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

foo = math.cos(bar)

如果在main.py命名空间中无法识别math符号,它将会非法


哦。我想知道my_own_module.math.sin(bar)是否可行(在“main.py”中不需要import math)? - nerdfever.com
是的,你说得对。main.py 知道 my_own_module 这个名称,而 my_own_module 又认识 math 这个名称(math 又认识 cos 这个名称)。 - MarianD

1
这不像C++中的#include,导入模块是必需的,不能省略。导入模块才能引用其中的内容,在每个使用它的文件中都是如此。

0
一个好问题。简短的回答是,如果您在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)

而在我的_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)

请注意,如果您调用从另一个文件导入的函数,则无需添加数学运算符。希望这能进一步澄清您的疑问 :)

但是值得注意的是,这将排除当前命名空间中的数学运算符,因此使任何进一步调用数学函数无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接