Python导入的好经验规则是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

我有点困惑于你可以用Python导入模块的多种方式。

import X
import X as Y
from A import B

我一直在阅读关于范围界定和命名空间的内容,但是我想就什么是最佳策略,哪些情况下以及为什么,提供实用建议。应该导入模块级别还是方法/功能级别?在__init__.py或在模块代码本身?

提问于
用户回答回答于

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

我们将导入放在文件的开头,就在主文件的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

扫码关注云+社区

领取腾讯云代金券