Python导入模块,这些模块都会导入另一个相同的模块。

5
我想要的是,我有一个名为foo.py的文件,它从bar1和bar2中导入类,它们都需要bar3,例如:
foo.py
from src import *
...

src/ __ init__.py

from bar1 import specialSandwichMaker
from bar2 import specialMuffinMaker

src/bar1.py

import bar3
class specialSandwichMaker(bar3.sandwichMaker)
...

src/bar2.py

import bar3
class specialMuffinMaker(bar3.muffinMaker)
...

有没有一种更有效的方法,可以使bar3对bar1和bar2文件可用,而不必让它们直接导入它?

from foo import *规则的一个例外是,如果foo中的每个项都以某个在foo中唯一的名称结尾或开头,则可以理有地使用它。例如,定义一个exceptions模块,并使每个异常以Error结尾。然后,您只需执行from exceptions import *,就可以准备好所有要raiseexcept的异常。请注意,如果重新加载模块,则以这种方式导入的类将__不会__随之重新加载。 - aaronasterling
2个回答

8
这是完全有效的;当导入一个模块时,Python会将其添加到 sys.modules 中。 import 语句首先检查这个字典(由于字典查找很快,所以速度很快)是否已经导入了该模块。因此,在这种情况下,bar1 将导入 bar3 并将其添加到 sys.modules 中。然后,bar2 将使用已经被导入的 bar3
您可以通过以下方式进行验证:
import sys
print( sys.modules )

请注意,from src import * 是糟糕的代码,你不应该使用它。要么使用import src并使用src.specialSandwichMaker引用,要么使用from src import specialSandwichMaker。这是因为模块不应该污染彼此的命名空间--如果你使用from src import *,则src中定义的所有全局变量也会出现在你的命名空间中。这是不好的。

谢谢,如果我使用“from src import *”,它只会从__init__文件中获取全局变量吗?还是它会从src目录下的其他模块中获取全局变量? - biokiwi
下面有文档记录。如果在__init__.py中定义了__all__,它将获取其中的所有内容。如果没有定义,则只会获取明确导入的内容。但这是针对那些使用import *的人的解决方法;你不应该这样做。 - Katriel


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