我想知道在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
或者使用_1485432中引入的显式相对导入:
# explicit relative
import ..A
import .B
什么是最pythonic的方式来做到这一点?
3 回答
绝对进口 . 从PEP 8:
显式相对导入是一个很好的语言功能(我猜),但它们并不像绝对导入那样明确 . 更易读的形式是:
特别是如果您导入几个不同的命名空间 . 如果你看一些包含从包中导入的编写良好的项目/教程,它们通常都遵循这种风格 .
你想要更明确的几个额外的击键将在他们试图找出你的命名空间时(特别是如果你迁移到3.x,其中一些包)将来保存其他人(也许你)很多时间名字已经改变) .
不再强烈建议不要使用Python相对导入,但在这种情况下强烈建议使用absolute_import .
请参阅this discussion引用Guido本人:
OP正确链接PEP 328,其中说:
另见几乎重复的问题When or why to use relative imports in Python
当然,它仍然是品味的问题 . 虽然使用相对导入来移动代码更容易,但这也可能会意外地破坏事物;并重命名进口并不困难 .
要从PEP 328强制执行新行为,请使用:
在这种情况下,隐式相对导入将不再可能(例如,
import localfile
将不再起作用,仅from . import localfile
) . 为了清洁和面向未来的行为,建议使用absolute_import .一个重要的警告是,由于PEP 338和PEP 366,相对导入需要将python文件作为模块导入 - 您无法执行具有相对导入的file.py或者您将获得
ValueError: Attempted relative import in non-package
.在评估最佳方法时应考虑此限制 . 在任何情况下,Guido都反对从模块运行脚本:
关于此事的详尽讨论可以在SO上找到;回覆 . Python 3这是非常全面的:
相对导入不仅让你可以在不改变数十个内部导入的情况下自由重命名你的包,但我也成功地解决了涉及循环导入或命名空间包等问题的某些问题,因为他们不会将Python发送回top“从顶级命名空间开始重新搜索下一个模块 .