Python 导入的良好经验法则是什么?
我对在Python中导入模块的各种方式有点困惑。
import X
import X as Y
from A import B
我一直在研究作用域和命名空间,但我想要一些实际的建议,关于在什么情况下使用什么样的导入方式比较好,以及为什么。导入应该在模块级别进行,还是在方法/函数级别进行?是在__init__.py
里,还是在模块的代码里?
我的问题并没有被“Python包 - 按类导入,而不是按文件”这个回答完全解决,虽然它确实有关系。
10 个回答
我通常会在模块的最开始用 import X
来引入整个模块。如果你只需要模块中的一个特定对象,可以用 from X import Y
来引入。
只有在遇到名字冲突的时候,我才会使用 import X as Y
这种方式。
我只在函数内部使用导入,来引入那些在主模块运行时需要的东西,比如:
def main():
import sys
if len(sys.argv) > 1:
pass
希望这对你有帮助!
让我给你分享一段在django-dev邮件列表上由Guido van Rossum发起的对话:
[...] 比如,谷歌的Python风格指南中提到,所有的导入都应该导入一个模块,而不是从这个模块中导入某个类或函数。因为模块的数量远远少于类和函数,所以如果用模块名来前缀某个东西,记住它的来源就容易多了。很多时候,不同的模块可能会定义同样名字的东西——这样,读代码的人就不需要回到文件顶部去查看某个名字是从哪个模块导入的。
来源: http://groups.google.com/group/django-developers/browse_thread/thread/78975372cdfb7d1a
1: http://code.google.com/p/soc/wiki/PythonStyleGuide#Module_and_package_imports
在我们公司的生产代码中,我们尽量遵循以下规则。
我们把导入的模块放在文件的开头,紧接着主文件的文档字符串,比如:
"""
Registry related functionality.
"""
import wx
# ...
现在,如果我们导入的类在这个模块里只有几个,我们就直接导入这个类的名字,这样在代码中只需要用到最后的部分,比如:
from RegistryController import RegistryController
from ui.windows.lists import ListCtrl, DynamicListCtrl
不过,有些模块里有很多类,比如所有可能的异常列表。这种情况下,我们就导入整个模块,然后在代码中引用它:
from main.core import Exceptions
# ...
raise Exceptions.FileNotFound()
我们尽量少用 import X as Y
,因为这样会让查找某个模块或类的使用变得困难。不过,有时候如果你想导入两个同名的类,但它们在不同的模块里,就不得不这样做,比如:
from Queue import Queue
from main.core.MessageQueue import Queue as MessageQueue
一般来说,我们不在方法内部做导入,因为这样会让代码变得更慢,也不容易阅读。有些人可能觉得这样可以轻松解决循环导入的问题,但更好的办法是重新组织代码。