导入顺序编码标准
PEP8 提到:
导入模块时应该按照以下顺序进行分组:
- 标准库的导入
- 相关的第三方库导入
- 本地应用程序或库特定的导入
每组导入之间应该留一个空行。
有没有办法使用静态代码分析工具,比如 pylint
、pyflakes
、pychecker
、pep8
来检查这个标准是否在包中被违反了呢?
违反标准的例子:
from my_package import my_module
from django.db import models
import os
正确的导入方式:
import os
from django.db import models
from my_package import my_module
6 个回答
有一个 flake8
插件,叫做 flake8-import-order。
这个插件会增加3种新的 flake8 警告:
I100: 你的导入语句顺序不对。
I101: 你在 from 导入中的名称顺序不对。
I201: 各个部分或导入之间缺少空行。
你可以看看这个链接 https://pypi.python.org/pypi/isort 或者这个链接 https://github.com/timothycrosley/isort
isort 是一个工具,它会检查你指定的文件,找出那些全局的导入行(也就是不在 try/except 块、函数等里面的导入),然后把这些导入都放到文件的最上面,并按导入的类型分组:
- 未来的导入
- Python 标准库
- 第三方库
- 当前 Python 项目
- 显式本地导入(在导入前加一个点,比如:from . import x)
自定义分隔部分(在配置文件中通过 forced_separate 列表定义)
在每个部分内部,导入会按字母顺序排列。isort 会自动删除重复的 Python 导入,并把过长的导入语句换行,默认的行长度是 80 个字符。
https://pypi.python.org/pypi/flake8-isort 可以把这个功能集成到 flake8 中。
编辑(2023年) Ruff 也可以根据这个标准检查或排序导入。
更新(2016年):sbywater 提供了最新的答案。
找到了!(偶然间,在阅读《黑客的Python指南》时发现的)
OpenStack Hacking Style Checks 项目名为 hacking,它引入了几个独特的 flake8
扩展。其中有一个叫 hacking_import_groups 的(相关的 提交)。
示例:
需求
示例中使用的文件
tox.ini
(我们需要告诉 flake8 我们想使用自定义检查)[hacking] local-check = hacking.core.hacking_import_groups
更新:在最新版本的
hacking
中,检查的路径发生了变化,现在是hacking.checks.imports.hacking_import_groups
。test.py
(检查的目标)import requests import sys from my_module import print_smth print_smth(requests.get('https://google.com')) print_smth(sys.version)
my_module.py
(test.py
使用的本地导入)def print_smth(smth): print smth
然后,如果我对 test.py
运行 flake8
:
$ flake8 test.py
test.py:2:1: H305 imports not grouped correctly (requests: third-party, sys: stdlib)
test.py:3:1: H305 imports not grouped correctly (sys: stdlib, my_module.print_smth: project)
test.py:3:1: H306 imports not in alphabetical order (sys, my_module.print_smth)
接着,如果我按照 PEP8
的要求将导入分组到正确的顺序:
import sys
import requests
from my_module import print_smth
print_smth(requests.get('https://google.com'))
print_smth(sys.version)
没有发现警告:
$ flake8 test.py
$
希望这能在未来帮助到某些人。
现在的pylint版本会这样做,并把它当作错误类型C0411来报告。