不再强烈建议不要使用Python相对导入,但在这种情况下,强烈建议使用absolute_import。
请参见Guido本人的讨论:
“这主要不是历史性的吗?在实施新的相对导入语法之前,相对导入存在各种问题。短期解决方案是建议不要使用它们。长期解决方案是实施明确的语法。现在现在是撤消反建议的时候了。当然,不用太过费心-我仍然发现他们有后天的品味;但是他们有他们的位置。”
OP正确链接了PEP 328,内容为:
提出了几个用例,其中最重要的是能够重新排列大型程序包的结构而无需编辑子程序包。另外,如果没有相对导入,包中的模块就无法轻松导入自身。
另请参阅几乎重复的问题:何时或为何在Python中使用相对导入
当然,它仍然是一个品味问题。尽管通过相对导入来移动代码更容易,但这也可能会意外地使事情中断。重命名进口商品并不难。
要从PEP 328强制执行新行为,请使用:
from __future__ import absolute_import
在这种情况下,隐式相对导入将不再可能(例如,import localfile
将不再起作用from . import localfile
)。为了使行为更干净,更可靠,建议使用absolute_import。
一个重要的警告是,由于 PEP 338和PEP 366,相对导入要求将python文件作为模块导入-您无法执行具有相对导入的file.py,否则将得到一个ValueError: Attempted relative import in non-package
。
在评估最佳方法时应考虑到这一限制。在任何情况下,Guido都反对从模块运行脚本:
我在__main__机器上的任何其他提议中都为-1。唯一的用例似乎是正在运行的脚本,它们恰好位于模块目录中,我一直将其视为反模式。为了让我改变主意,您必须说服我不要。
关于此问题的详尽讨论可以在SO上找到;回覆。Python 3相当全面:
from _ import ...
,所以你的例子是from .. import A
和from . import B