Python:导入“导入文件”

32 投票
2 回答
22187 浏览
提问于 2025-04-16 18:47

我在导入很多不同的脚本,所以我文件的顶部被导入语句搞得乱七八糟,比如:

from somewhere.fileA import ...
from somewhere.fileB import ...
from somewhere.fileC import ...
...

有没有办法把这些导入语句放到别的地方,然后我只需要导入那个文件,这样就只需要一个干净的导入了?

2 个回答

23

当然可以;只需要在你的主文件所在的同一个文件夹里创建一个叫做 myimports.py 的文件,然后把你需要导入的内容放进去。接着,在你的主脚本里只需使用 from myimports import * 就可以了。

39

我强烈建议你不要这样做。你又犯了全局包含文件的错误。虽然现在只有一个模块在引入你所有的模块(而不是所有模块都引入一个全局模块),但关键是,如果这些模块有合理的理由被归在一个共同的名字下,那也可以。如果没有理由,那它们应该保持为独立的包含。原因在于文档。如果我打开你的文件,只看到一个引入,我就不知道引入了什么,来自哪里。相反,如果我有一个引入列表,我可以一眼看出需要什么,不需要什么。

还有一个重要的错误我想你可能也在犯。当你说

from somewhere.fileA import ...
from somewhere.fileB import ...
from somewhere.fileC import ...

我猜你是在引入一个类,比如这样

from somewhere.fileA import MyClass

这是错误的。这个替代方案要好得多

 from somewhere import fileA 

 <later>

 a=fileA.MyClass()

为什么呢?有两个原因:首先是命名空间。如果你有两个模块都有一个叫 MyClass 的类,就会发生冲突。第二是文档。假设你使用了第一个选项,我在你的代码中发现了以下这一行

 a=MyClass()

现在我完全不知道这个 MyClass 是从哪里来的,我得在你所有的文件中到处查找才能找到它。用模块名来限定它,可以让我立即明白它的来源,并且可以通过搜索快速找到 fileA 模块在你的程序中使用的地方。

最后一点:当你说“fileA”时,你犯了一个错误。这里是模块(或包),而不是文件。模块对应文件,包对应目录,但它们也可以对应到 egg 文件,甚至你可以创建一个没有文件的模块。这是概念的命名问题,属于一个侧面的问题。

撰写回答