Python: 导入一个“导入文件”

31

我正在导入许多不同的脚本,所以我的文件顶部被import语句弄得杂乱无章,例如:

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

有没有办法把它们全部移动到其他地方,然后只需导入该文件,这样就只需要一个干净的导入了吗?

2个回答

38
我强烈反对你想做的事情。你又犯了全局包含文件错误。虽然只有一个模块导入了所有模块(而不是所有模块都导入了全局模块),但其余的问题在于,如果有一个合理的理由将所有这些模块收集到一个共同的名称下,那就没问题。如果没有理由,那么它们应该保持为单独的包含文件。原因是文档化。如果我打开你的文件,只看到一个导入,我就无法得知导入的内容和来源。另一方面,如果我有导入列表,我就能一眼知道需要什么和不需要什么。
此外,我认为你还有另一个重要的错误。当你说
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从哪里来,我将不得不在所有文件中进行搜索才能找到它。通过使用模块名称限定,我可以立即理解它来自哪里,并且通过/search立即找到在程序中使用fileA模块的位置。

最后注意:当你说“fileA”时,你犯了一个错误。有模块(或包),而不是文件。模块映射到文件,包映射到目录,但它们也可能映射到egg文件,甚至可以创建没有任何文件的模块。这是概念命名问题,是一个次要问题。


24

当然可以;只需在主文件所在的相同目录中创建一个名为 myimports.py 的文件,并将导入语句放在里面。随后,您就可以在主脚本中简单地使用 from myimports import * 来导入这些模块。


3
请注意,除非在特殊情况下并且您可以百分之百地保证没有一个名称被遮蔽,否则不应执行此操作。请参阅http://docs.python.org/howto/doanddont.html#from-module-import。 - user395760
3
当然可以;这并不是我推荐在任何情况下都应该采用的编码实践,但我不能质疑发帖者的意图是什么呢? :) - Tamás
7
对于“如何使用错误的方法处理 X”的问题,通常(对所有人都有益)的回答是:“X具体是什么?……啊,是这样做更好:……” - user395760
2
当试图理解别人的代码时,十几个导入其实并不算太多。 - Eric Wilson
1
import myimports 不起作用吗?导入不是递归的吗? - Aaron Franke
显示剩余3条评论

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