PEP8表明:
进口应按以下顺序分组:
- 标准库导入
- 相关的第三方导入
- 本地应用程序/库特定导入
醇>您应该在每组导入之间添加一个空行。
有没有办法使用静态代码分析工具检查包中是否违反了标准,例如pylint
,pyflakes
,pychecker
,pep8
?< / p>
违规示例:
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
答案 0 :(得分:53)
更新(2016):@sbywater有最新答案。
名为hacking的OpenStack黑客风格检查项目引入了几个独特的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
$
希望这将有助于将来的某些人。
答案 1 :(得分:53)
当前版本的pylint现在执行此操作,并将其报告为错误类C0411。
答案 2 :(得分:24)
查看https://pypi.python.org/pypi/isort或https://github.com/timothycrosley/isort
isort解析全局级别导入行的指定文件(在try / excepts块,函数等之外导入...)并将它们全部放在按导入类型组合在一起的文件的顶部:
- 未来
- Python标准库
- 第三方
- 当前的Python项目
- 显式本地(。导入之前,如:from .import x)
自定义单独部分(由配置文件中的forced_separate列表定义) 在每个部分的内部,导入按字母顺序排序。 isort自动删除重复的python导入,并将导入包装到指定的行长度(默认为80)。
https://pypi.python.org/pypi/flake8-isort将此功能插入flake8
答案 3 :(得分:6)
存在flake8
插件:flake8-import-order。
此软件包添加了3个新的flake8警告
I100:您的导入语句顺序错误。
I101:您导入的名称顺序错误。
I201:缺少部分或导入之间的换行符。
答案 4 :(得分:1)
Flake8 插件 Alphabetize https://github.com/tlocke/flake8-alphabetize 检查导入排序顺序,旨在与 Black 格式化程序配合使用。它遵循具有单一样式的黑色格式化程序方法,无法配置样式。 Alphabetize 还会检查 __all__
属性的顺序。
答案 5 :(得分:0)
总的来说,您需要构建您的导入语句以满足 pep8 import standard。
我发现 isort 库在排序导入语句以摆脱 flake8 排序问题方面很有用。
pip install isort
isort <your_python_file>.py