首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python导入有哪些好的经验法则?

Python导入有哪些好的经验法则?
EN

Stack Overflow用户
提问于 2008-10-11 09:59:36
回答 8查看 51.8K关注 0票数 74

我对在Python中导入模块的多种方式感到有点困惑。

代码语言:javascript
复制
import X
import X as Y
from A import B

我一直在阅读有关作用域和命名空间的内容,但我想要一些关于什么是最佳策略、在什么情况下以及为什么是最佳策略的实用建议。导入应该发生在模块级别还是方法/函数级别?在__init__.py中还是在模块代码本身中?

我的问题并没有真正被"Python packages - import by class, not file“回答,尽管它显然是相关的。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-10-11 10:15:40

在我们公司的生产代码中,我们尝试遵循以下规则。

我们将导入放在文件的开头,紧跟在主文件的文档字符串之后,例如:

代码语言:javascript
复制
"""
Registry related functionality.
"""
import wx
# ...

现在,如果我们导入的类是导入模块中为数不多的类之一,我们将直接导入名称,因此在代码中我们只需使用最后一部分,例如:

代码语言:javascript
复制
from RegistryController import RegistryController
from ui.windows.lists import ListCtrl, DynamicListCtrl

然而,有些模块包含几十个类,例如所有可能的异常列表。然后我们导入模块本身,并在代码中引用它:

代码语言:javascript
复制
from main.core import Exceptions
# ...
raise Exceptions.FileNotFound()

我们尽可能少使用import X as Y,因为它使得搜索特定模块或类的用法变得困难。但是,有时如果您希望导入两个同名但存在于不同模块中的类,则必须使用它,例如:

代码语言:javascript
复制
from Queue import Queue
from main.core.MessageQueue import Queue as MessageQueue

一般来说,我们不会在方法中进行导入--它们只会使代码变得更慢,可读性更差。有些人可能会发现这是一个很容易解决循环导入问题的好方法,但更好的解决方案是代码重组。

票数 68
EN

Stack Overflow用户

发布于 2008-10-11 10:10:13

我通常会在模块级使用import X。如果只需要模块中的单个对象,请使用from X import Y

只有在遇到名称冲突时才使用import X as Y

当模块用作主模块时,我只在函数级使用imports来导入我需要的东西,比如:

代码语言:javascript
复制
def main():
  import sys
  if len(sys.argv) > 1:
     pass

HTH

票数 12
EN

Stack Overflow用户

发布于 2013-04-18 05:10:35

上面有人说

代码语言:javascript
复制
from X import A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P

等同于

代码语言:javascript
复制
import X

import X允许直接修改A-P,而from X import ...则创建A-P的副本。对于from X import A..P,如果变量被修改,您将无法获得变量的更新。如果你修改了它们,你只修改了你的副本,但是X知道你的修改。

如果A-P是函数,你不会知道其中的区别。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/193919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档