我想知道在Python应用程序中导入包的首选方法。我有一个这样的包结构:project.app1.modelsproject.app1.viewsproject.app2.modelsproject.app1.views进口project.app1.models和project.app2.models。我想到有两种方法可以做到这一点。绝对进口:import A.Aimport A.B.B或具有明确的相对导入,如在Python 2.5中使用PEP 328引入的那样:# explicit relativefrom .. import Afrom . import B什么是最pythonic的方式做到这一点?
3 回答

心有法竹
TA贡献1866条经验 获得超5个赞
绝对进口。从PEP 8:
强烈建议不要将相对进口用于包装内进口。始终对所有导入使用绝对包路径。即使现在PEP 328 [7]已在Python 2.5中完全实现,仍不鼓励使用其显式相对导入的样式。绝对导入更具可移植性,通常更具可读性。
显式相对导入是一种不错的语言功能(我想),但是它们不像绝对导入那样显式。更具可读性的形式是:
import A.A
import A.B.B
尤其是当您导入几个不同的名称空间时。如果您看一些写得很好的项目/教程,其中包括从包中导入的内容,则它们通常遵循这种风格。
您需要进行一些更明确的额外击键操作,这将在将来其他人(也许您)试图找出您的名称空间时(尤其是如果您迁移到3.x,其中包括一些软件包)节省了很多时间。名称已更改)。

蝴蝶不菲
TA贡献1810条经验 获得超4个赞
相对导入不仅使您以后可以自由重命名程序包,而无需更改数十个内部导入,而且我在解决诸如循环导入或命名空间程序包之类的某些问题方面也取得了成功,因为它们不会将Python发送回“顶部”以从顶级名称空间重新开始搜索下一个模块。
添加回答
举报
0/150
提交
取消