【问题标题】:When to use absolute imports何时使用绝对导入
【发布时间】:2011-04-27 22:35:49
【问题描述】:

我正在更改一堆旧的 python 代码,这些代码偶尔会遇到包之间的名称冲突。我有一个关于何时应该使用绝对导入以及仅按名称导入同级模块是否合适的问题。

/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py

包中的每个 import 语句是否应该如下所示:

import package.subX.moduleX

from package.subX import moduleX

在子包__init__.py 文件中怎么样。简单的说会不会错

import moduleA
import moduleB

或者,在/package/subA/moduleA.py中,简单的说:

import moduleB

【问题讨论】:

  • 如果你想在整个代码中保存一些字符,你也可以使用别名,如from package.subA import moduleA as a_moduleAfrom package.subB import moduleA as b_moduleA,对我来说似乎有点乱,但这是另一种选择...

标签: python import


【解决方案1】:

相对导入被证明是一个非常糟糕的主意,尽管它们长期以来一直是默认行为。您可以在此站点上找到很多问题,其中有人只是在内置模块后命名他们的文件,然后用奇怪的错误消息破坏他们的应用程序。

这就是为什么通过引用您的项目无处不在(包括包)来进行绝对导入总是好的原因。

简而言之,使用这种风格:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass

引用PEP8:

包内导入的相对导入高度 灰心。 始终对所有导入使用绝对包路径。 即使现在PEP 328 已在 Python 2.5 中完全实现, 积极劝阻其明确的相对进口风格; 绝对导入更便携,通常更易读。

【讨论】:

  • +1 与绝对导入很容易看到你会得到什么。
  • 截至 213 年 9 月,此答案是错误的,因为 PEP8 已更改。例如:“但是,显式相对导入是绝对导入的可接受替代方案,尤其是在处理复杂的包布局时,使用绝对导入会不必要地冗长”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2020-09-30
  • 2020-08-12
  • 2014-05-02
相关资源
最近更新 更多