Python相对导入的PEP排序规范及项目场景正确写法咨询
嘿,这个问题问得很实在!我来帮你拆解清楚Python相对导入的排序规范、PEP标准要求,再结合你的项目结构分析那两种写法的问题。
Python相对导入的排序规范与PEP要求
一、PEP标准的核心要求
首先看PEP 8(Python的代码风格指南)里关于导入的规定:
导入需要按以下分组排序,组与组之间空一行:
- 标准库导入
- 第三方库导入
- 本地项目/库的导入
绝对导入是推荐的方式,因为它可读性更强,当导入配置出错时(比如包内目录意外出现在sys.path),能给出更清晰的错误提示。相对导入是允许的,但通常不如绝对导入优先。
针对相对导入本身的排序,PEP 8没有做强制的硬性规定,但社区普遍遵循可读性优先的原则:
- 如果同时存在绝对导入和相对导入,优先放绝对导入(符合PEP8推荐绝对导入的导向)
- 如果都是相对导入,一般按模块层级从远到近排序(比如先
...(上三级目录),再..(上二级),最后.(同级/上级一级)),或者按业务逻辑相关性排序,但层级顺序是更常见的惯例。
二、你的项目结构分析
先明确你的项目目录层级(假设项目根目录已经在Python的sys.path中):
项目根/ ├── core/ │ ├── __init__.py │ ├── forms.py # 包含CustomerForm │ └── models.py # 包含Person ├── tests/ │ ├── __init__.py │ └── form_tests/ │ ├── __init__.py │ └── test_xpto.py # 当前文件 └── login.py # 包含DefaultLogin
test_xpto.py的模块路径是tests.form_tests.test_xpto,所以它的相对导入层级是:
.指代tests.form_tests目录..指代tests目录...指代项目根目录
现在看两种写法的问题:
写法一的问题
from core.models import Person # 这个是正确的绝对导入 from ..login import DefaultLogin # 错误!`..`指向tests目录,而login.py在项目根,不在tests下 from ...forms import CustomerForm # 错误!`...`指向项目根,但根目录下没有forms.py,forms在core/里
这里后两行的相对导入路径完全错误:
- 要导入根目录的
login.py,应该用...login(或者更推荐绝对导入from login import DefaultLogin) - 要导入
core.forms里的CustomerForm,正确的绝对导入是from core.forms import CustomerForm,相对导入的话是...core.forms import CustomerForm(但完全没必要用相对,绝对导入更清晰)
写法二的问题
from ...forms import CustomerForm # 同样错误,根目录没有forms.py from ..login import DefaultLogin # 错误,tests目录没有login.py from core.models import Person # 这个绝对导入是对的
除了最后一行的绝对导入正确,前两行的相对导入路径都错了,而且排序也不符合社区惯例(绝对导入应该放在相对导入之前)。
三、正确的写法示例
按照PEP8的推荐,优先用绝对导入,写法如下:
# 本地项目绝对导入,按模块相关性排序(core相关在前,根目录的login在后) from core.models import Person from core.forms import CustomerForm from login import DefaultLogin
如果一定要用相对导入(不推荐,但满足需求的话),正确的写法+规范排序应该是:
# 先层级最远的相对导入(根目录的core和login),再近的(这里没有更近的) from ...core.models import Person from ...core.forms import CustomerForm from ...login import DefaultLogin
内容的提问来源于stack exchange,提问作者Aipi
相关产品推荐
相关产品推荐

