我对在Python中导入模块的多种方式感到有点困惑。
import X
import X as Y
from A import B
我一直在阅读有关作用域和命名空间的内容,但我想要一些关于什么是最佳策略、在什么情况下以及为什么是最佳策略的实用建议。导入应该发生在模块级别还是方法/函数级别?在__init__.py
中还是在模块代码本身中?
我的问题并没有真正被"Python packages - import by class, not file“回答,尽管它显然是相关的。
发布于 2008-10-11 10:15:40
在我们公司的生产代码中,我们尝试遵循以下规则。
我们将导入放在文件的开头,紧跟在主文件的文档字符串之后,例如:
"""
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
一般来说,我们不会在方法中进行导入--它们只会使代码变得更慢,可读性更差。有些人可能会发现这是一个很容易解决循环导入问题的好方法,但更好的解决方案是代码重组。
发布于 2008-10-11 10:10:13
我通常会在模块级使用import X
。如果只需要模块中的单个对象,请使用from X import Y
。
只有在遇到名称冲突时才使用import X as Y
。
当模块用作主模块时,我只在函数级使用imports来导入我需要的东西,比如:
def main():
import sys
if len(sys.argv) > 1:
pass
HTH
发布于 2013-04-18 05:10:35
上面有人说
from X import A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
等同于
import X
import X
允许直接修改A-P,而from X import ...
则创建A-P的副本。对于from X import A..P
,如果变量被修改,您将无法获得变量的更新。如果你修改了它们,你只修改了你的副本,但是X知道你的修改。
如果A-P是函数,你不会知道其中的区别。
https://stackoverflow.com/questions/193919
复制相似问题