我可以通过多种方式在Python中导入模块而感到困惑.
import X import X as Y from A import B
我一直在阅读有关作用域和名称空间的内容,但我想就什么是最佳策略,在哪种情况下以及为什么,提供一些实用的建议.是否应该在模块级别或方法/功能级别进行导入?在__init__.py
模块代码本身中?
我的问题并没有真正回答" Python包 - 按类导入,而不是文件 ",尽管它显然是相关的.
在我们公司的生产代码中,我们尝试遵循以下规则.
我们将导入放在文件的开头,紧跟在主文件的docstring之后,例如:
""" 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
作为一般规则,我们不在方法内部进行导入 - 它们只是使代码更慢且可读性更低.有些人可能会发现这是一种轻松解决循环导入问题的好方法,但更好的解决方案是代码重组.
让我在Guido van Rossum开始的django-dev邮件列表上粘贴一部分对话:
[...]例如,它是Google Python样式指南[1]的一部分,所有导入必须导入模块,而不是该模块的类或函数.有比模块更多的类和函数,所以如果它以模块名称为前缀,那么回想一下特定事物的来源要容易得多.通常,多个模块会定义具有相同名称的内容 - 因此代码的读者不必返回到文件的顶部以查看从哪个模块导入给定名称.
资料来源: http ://groups.google.com/group/django-developers/browse_thread/thread/78975372cdfb7d1a
1:http://code.google.com/p/soc/wiki/PythonStyleGuide#Module_and_package_imports
我通常会import X
在模块级别上使用.如果您只需要模块中的单个对象,请使用from X import Y
.
仅import X as Y
在您遇到名称冲突的情况下使用.
我只使用函数级别的导入来导入模块用作主模块时需要的东西,例如:
def main(): import sys if len(sys.argv) > 1: pass
HTH
上面有人说过
from X import A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
相当于
import X
import X
允许直接修改AP,同时from X import ...
创建AP的副本.对于from X import A..P
你没有得到更新变量,如果他们被修改.如果您修改它们,则只修改您的副本,但X确实知道您的修改.
如果AP是功能,你就不会知道它们的区别.
其他人已经涵盖了这里的大部分内容,但我只是想添加一个我将使用的案例import X as Y
(暂时),当我尝试新版本的类或模块时.
因此,如果我们要迁移到模块的新实现,但又不想一次性删除所有代码库,我们可能会编写一个xyz_new
模块并在我们迁移的源文件中执行此操作:
import xyz_new as xyz
然后,一旦我们切换整个代码库,我们只需更换xyz
模块xyz_new
并将所有导入更改回
import xyz