进口订单编码标准


84

PEP8建议:

导入应按以下顺序分组:

  1. 标准库导入
  2. 相关第三方进口
  3. 本地应用程序/特定于库的导入

您应该在每组导入之间放置一个空白行。

有没有一种方法来检查,如果该标准违反了使用静态代码分析工具包的任何地方,比如pylintpyflakespycheckerpep8


违规示例:

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

1
pep8工具当前不检查此内容-它仅检查一条线上的多个导入(E401)
DNA

@DNA很高兴知道,谢谢。希望那里有东西。
alecxe 2014年

PyCharm可能会这样做,但我不确定100%。不过要花钱。
2014年

5
@Claudiu-Pycharm也具有社区版本。
阿米特·维尔玛

3
如果最终找不到任何东西,则可以编写自己的pylint插件来为您检查。看看pylint的-插件-utils的和示例插件这里。(这可能更适合作为评论,但我没有评论的声誉。)
mobeets 2014年

Answers:


70

现在,当前版本的pylint会执行此操作,并将其报告为错误类C0411。


9
现在,这应该是一个投票率更高的答案。对于不再显示错误编号的最新版本,它是error class wrong-import-order
索伦·比约恩斯塔德

54

更新(2016): sbywater具有最新答案。


找到了!(顺便说一句,在阅读“ Python黑客指南”时)

名为hacking的OpenStack Hacking Style Checks项目引入了几个独特的flake8扩展。其中有hacking_import_groups(相关commit)。

例:

  • 要求

    • 毒物
    • 薄片8
    • 入侵(来自master分支):

      $ 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更改了支票路径的最新版本,现在是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
您应该将赏金授予自己:-)。顺便说一句,我可能会开始使用它
蒂姆

2
他们拿出了这张支票,理由是它太容易出错并且很难:github.com/openstack-dev/hacking/commit/…–
敬业的人

@jobevers感谢您的更新!好吧,我使用它没有任何问题:)
alecxe 2015年

26

看看https://pypi.python.org/pypi/isorthttps://github.com/timothycrosley/isort

isort解析指定文件以进行全局级别的导入行(try / excepts块,函数等之外的导入),并将它们全部放在按导入类型分组在一起的文件的顶部:

  • 未来
  • Python标准库
  • 第三方
  • 目前的Python专案
  • 显式本地(导入前。,如:from。import x)

自定义单独的部分(由配置文件中的force_separate列表定义)在每个部分的内部,导入按字母顺序排序。isort会自动删除重复的python导入,并将导入中的long换成指定的行长(默认为80)。

https://pypi.python.org/pypi/flake8-isort将此功能插入flake8


2
只要注意,如果您运行isort script_name.py --check-only-它只会检查未排序的导入并打印出结果-这就是我所需要的。非常感谢您的选择。
alecxe 2014年

isort -rc --check --diff递归检查所有文件,仅检查并显示差异
ptim

7

flake8存在一个插件:flake8-import-order

此软件包添加了3个新的flake8警告

I100:您的导入语句顺序错误。

I101:导入中的名称顺序错误。

I201:部分或导入之间缺少换行符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.