一尘不染

Python模块的绝对和显式相对导入

json

我想知道在Python应用程序中导入包的首选方法。我有一个这样的包结构:

project.app1.models
project.app1.views
project.app2.models

project.app1.views进口project.app1.models和project.app2.models。我想到有两种方法可以做到这一点。

绝对进口:

import A.A
import A.B.B

或具有明确的相对导入,如在Python 2.5中使用PEP 328引入的那样:

# explicit relative
from .. import A
from . import B

什么是最pythonic的方式做到这一点?


阅读 291

收藏
2020-07-27

共1个答案

一尘不染

绝对进口。从PEP 8:

强烈建议不要将相对进口用于包装内进口。始终对所有导入使用绝对包路径。即使现在PEP 328 [7]已在Python 2.5中完全实现,仍不鼓励使用其显式相对导入的样式。绝对导入更具可移植性,通常更具可读性。

显式相对导入是一种不错的语言功能(我想),但是它们不像绝对导入那样显式。更具可读性的形式是:

import A.A
import A.B.B

特别是如果您导入几个不同的名称空间。如果您看一些写得很好的项目/教程,其中包括从包中导入的内容,则它们通常遵循这种风格。

您需要进行一些更明确的额外击键操作,将来会在其他人(也许是您)试图弄清楚您的命名空间时(尤其是如果您迁移到3.x,在其中一些软件包中)节省了很多时间。名称已更改)。

2020-07-27