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
当前版本的 pylint 现在执行此操作,并将其报告为错误类 C0411。
更新(2016):sbywater有最新的答案。
找到了! (无意中,在阅读《Python 黑客指南》时)
OpenStack Hacking Style Checks 名为 hacking 的项目引入了几个独特的
flake8
扩展。其中有hacking_import_groups(相关commit)。
示例:
要求
示例中使用的文件
tox.ini
(我们需要告诉 flake8 我们想要使用自定义检查)
[hacking]
local-check = hacking.core.hacking_import_groups
UPD:使用最新版本的
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
然后,如果我运行
flake8
对抗 test.py
:
$ 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
$
希望这对将来的人有帮助。
看看 https://pypi.python.org/pypi/isort 或 https://github.com/timothycrosley/isort
isort 解析指定文件的全局级导入行(在 try / excepts 块、函数等之外导入),并将它们全部放在文件的顶部,并按导入类型分组在一起:
- 未来
- Python 标准库
- 第三方
- 当前的Python项目
- 显式本地化(. 在导入之前,如: from . import x)
自定义单独部分(由配置文件中的forced_separate列表定义) 在每个部分内,导入按字母顺序排序。 isort 自动删除重复的 python 导入,并将导入中的 long 换行到指定的行长度(默认为 80)。
https://pypi.python.org/pypi/flake8-isort将此功能插入到flake8中
编辑(2023)Ruff还可以根据此标准对导入进行检查或排序。
存在
flake8
插件:flake8-import-order。
此软件包添加了 3 个新的 flake8 警告
I100:您的导入语句顺序错误。
I101:您的 from import 中的名称顺序错误。
I201:部分或导入之间缺少换行符。
Flake8 插件 Alphabetize https://github.com/tlocke/flake8-alphabetize 检查导入排序顺序,旨在与 Black 格式化程序配合使用。它遵循具有单一样式的 Black 格式化程序方法,无法配置样式。按字母顺序排列还会检查
__all__
属性的顺序。