import订单编码标准
PEP8build议:
import应按以下顺序进行分组:
- 标准库导入
- 有关的第三方import
- 本地应用程序/库特定的导入
您应该在每组导入之间留出一个空行。
有没有办法使用静态代码分析工具,如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有最近的答案。
find了! (不小心,在阅读“黑客指南”时)
OpenStack黑客风格检查项目名为黑客引入了几个独特的flake8
扩展。 其中有hacking_import_groups (相关提交 )。
例:
-
要求
- TOX
- flake8
-
黑客 (来自主分支):
$ git clone https://github.com/openstack-dev/hacking.git $ cd hacking/ $ python setup.py install
-
文件中使用的文件
-
tox.ini
(我们需要告诉flake8我们要使用自定义检查)[hacking] local-check = hacking.core.hacking_import_groups
UPD:最新版本的
hacking
检查的path改变了,现在是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进行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
isortparsing全局级别导入行的指定文件(在try / excepts块,函数等外部导入),并将它们全部放在按导入types分组在一起的文件顶部:
- 未来
- Python标准库
- 第三方
- 目前的Python项目
- 显式地本地(。import之前,如:from。import x)
自定义单独部分(由configuration文件中的forced_separate列表定义)在每个部分的内部,导入按字母顺序sorting。 isort会自动删除重复的python导入,并将导入的长整数换成指定的行长度(默认为80)。
https://pypi.python.org/pypi/flake8-isort将此function插入到flake8中;
存在flake8
插件: flake8-import-order 。
这个包增加了3个新的flake8警告
I100:您的import报表错误顺序。
I101:从导入的名称是错误的顺序。
I201:缺less部分或import之间的换行符。